Java's UUID.nameUUIDFromBytes to written in JavaScript?

后端 未结 3 1871
梦谈多话
梦谈多话 2021-01-06 23:20

I have a 3rd party application that I can\'t control that uses Java\'s UUID.nameUUIDFromBytes to create a string. I need to reproduce this function written in J

相关标签:
3条回答
  • 2021-01-06 23:35

    This answer attempts to improve on the previous ones as follows

    • It includes the hyphens in the output, just like Java
    • Does not rely on additional external libraries that are not supported anymore
    const crypto = require('crypto');
    
    function javaHash(input:string) {
      let md5Bytes = crypto.createHash('md5').update(input).digest();
      md5Bytes[6]  &= 0x0f;  /* clear version        */
      md5Bytes[6]  |= 0x30;  /* set to version 3     */
      md5Bytes[8]  &= 0x3f;  /* clear variant        */
      md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
      const hex = md5Bytes.toString('hex')
      const uuid = hex.replace(/(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})/, "$1-$2-$3-$4-$5");
      return uuid;
    }
    

    It relies on the UUID spec being exactly 128bits in length

    0 讨论(0)
  • 2021-01-06 23:39

    Okay so, this is not pure-js, but it is nodejs.

    const crypto = require('crypto');
    
    function javaHash(input) {
        let md5Bytes = crypto.createHash('md5').update(input).digest();
        md5Bytes[6]  &= 0x0f;  /* clear version        */
        md5Bytes[6]  |= 0x30;  /* set to version 3     */
        md5Bytes[8]  &= 0x3f;  /* clear variant        */
        md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
        return md5Bytes.toString('hex');
    }
    
    0 讨论(0)
  • 2021-01-06 23:52

    This solution gave me exact UUID for me

    const crypto = require('crypto');
    const hexToUuid = require('hex-to-uuid');
    
    const javaHash = (input) => {
        var md5Bytes = crypto.createHash('md5').update(input).digest()
        md5Bytes[6] &= 0x0f;  // clear version        
        md5Bytes[6] |= 0x30;  // set to version 3     
        md5Bytes[8] &= 0x3f;  // clear variant        
        md5Bytes[8] |= 0x80;  // set to IETF variant  
        return hexToUuid(md5Bytes.toString('hex'))
    }
    
    console.log('javaHash', javaHash("HelloWorld"));
        // 68e109f0-f40c-372a-95e0-5cc22786f8e6
    
    0 讨论(0)
提交回复
热议问题