java - 此 Java UUID5 实现未通过单元测试

标签 java uuid

我找不到适用于 Java 的自包含 UUID5 实现,因此我尝试在下面滚动此解决方案。它通过了我的一些单元测试但未通过其他单元测试。这里面有什么明显的错误吗?

public static UUID UUID5(UUID namespace, String name) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("SHA-1");
    } catch (NoSuchAlgorithmException nsae) {
        throw new InternalError("SHA-1 not supported");
    }

    byte[] namespaceBytes = ByteBuffer.allocate(16).putLong(namespace.getMostSignificantBits()).putLong(namespace.getLeastSignificantBits()).array();
    byte[] nameBytes;
    try {
        nameBytes = name.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new InternalError("UTF-8 encoding not supported");
    }

    byte[] toHashify = new byte[namespaceBytes.length + nameBytes.length];
    System.arraycopy(namespaceBytes, 0, toHashify, 0, namespaceBytes.length);
    System.arraycopy(nameBytes, 0, toHashify, namespaceBytes.length, nameBytes.length);

    byte[] data = md.digest(toHashify);
    data = Arrays.copyOfRange(data, 0, 16); // Wikipedia says "Note that the 160 bit SHA-1 hash is truncated to 128 bits to make the length work out."

    data[6]  &= 0x0f;  /* clear version        */
    data[6]  |= 0x50;  /* set to version 5     TODO is this the correct way to do it     */
    data[8]  &= 0x3f;  /* clear variant        */
    data[8]  |= 0x80;  /* set to IETF variant  */

    long msb = 0;
    long lsb = 0;
    assert data.length == 16 : "data must be 16 bytes in length";
    for (int i=0; i<8; i++)
        {msb = (msb << 8) | (data[i] & 0xff);}
    for (int i=8; i<16; i++)
        {lsb = (lsb << 8) | (data[i] & 0xff);}

    return new UUID(msb, lsb);
}

最佳答案

使用Apache Commons Id ,更具体地说 UUID.nameUUIDFromString .

UUID uuid5 = UUID.nameUUIDFromString("www.ford.com", 
       UUID.fromString("078d4e79-244f-440e-844d-9454eadfd411"),
       UUID.SHA1_ENCODING);

UUID.SHA1_ENCODING 将生成版本 5 UUID。

关于java - 此 Java UUID5 实现未通过单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501357/

相关文章:

java - NoHandlerFoundException 集中的 'parameters map' 在哪里?

java - 我可以从导入的包中为类创建对象吗

ios - 我正在使用 UUID 从 iOS 设备获取唯一代码,但在卸载或删除并重新安装时 id 已更改

c++ - C++ 中与平台无关的 GUID 生成?

serialization - avro-rs解释 `uuid`给出SerdeError

java - Activity关闭时内存未释放

java - Spark - 在执行期间更改并行度

java - Java Web 应用程序中的唯一序列号

MacOS 上的 uuidgen 生成所有大写字母

java - 从 JSON 对象填充 JTable