当前位置: 首页 > 知识库问答 >
问题:

这个Java UUID5实现没有通过单元测试

慕阳平
2023-03-14

我找不到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);
}

共有1个答案

陈宜修
2023-03-14

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

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

<code>UUID。SHA1_ENCODING将生成版本5 UUID。

 类似资料:
  • 本文向大家介绍Spring Boot通过Junit实现单元测试过程解析,包括了Spring Boot通过Junit实现单元测试过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Boot通过Junit实现单元测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.需要在pom.xml中引入spring-boo

  • 我有一个简单的功能,我想测试,但明显的结果是没有发生。。。 我的函数是如何工作的(实际上它确实工作,只是没有正确测试) 我将字符串传递到函数中 当我运行所示的测试时,我收到错误: 预期默认值等于hare失败 我的组件 我的测试

  • 我有一个混合了objective-c和Swift的项目,我试图为它编写单元测试。我的项目名称是:Alphaproject我的产品模块名称是:Alphaproject我在我的主要目标(Alphaproject)中设置为YES Defines module,并设置为YES EnableTestability,以便仅在此同一目标中进行调试。 在我的测试类中,我尝试导入我的产品模块名称: @可测试导入项目

  • 我正在做一个C项目,开发了一些测试用例。我能够执行测试用例,直到突然所有的测试用例从测试浏览器中消失。我的意思是说,即使测试项目被正确编译,测试方法也不会显示在测试资源管理器中。 我遵循这里给出的步骤,但没有成功。 这些是我做过的事情: 我删除了文件夹的内容。 我将默认的处理器架构更改为。(

  • 本文向大家介绍Java mockito单元测试实现过程解析,包括了Java mockito单元测试实现过程解析的使用技巧和注意事项,需要的朋友参考一下 待测试的服务接口: 预览 待测试的服务的实现类: Mockito 的更多高级用法请参考官方网站和框架配套 wiki。如果需要 mock 静态方法、私有函数等,可以学习 PowerMock, 拉取其源码通过学习单元测试来快速掌握其用法。 以上就是本文

  • 我有一个方法,如果名称与正则表达式匹配,则必须返回true,如果名称具有特殊字符或数字,则必须返回null。 这是方法: 这是对无法通过的方法的测试: