我有一个无法控制的第三方应用程序,该应用程序使用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');
}