我有一个无法控制的第三方应用程序,该应用程序使用Java的UUID.nameUUIDFromBytes创建字符串。我需要重现此用JS编写的函数。
OpenJDK's source中,我发现了这一点:

public static UUID nameUUIDFromBytes(byte[] name) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException nsae) {
        throw new InternalError("MD5 not supported", nsae);
    }
    byte[] md5Bytes = md.digest(name);
    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 new UUID(md5Bytes);
}
对于我一生,我无法弄清楚,主要是因为JS如何抽象字节。
TL; DR:我只需要一个js函数,该函数将生成与UUID.nameUUIDFromBytes((VARIABLE).getBytes(Charsets.UTF_8)).toString()相同的字符串。

最佳答案

好的,这不是纯js,而是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');
}

09-20 10:49