【问题标题】:Comparing UUIDs in Java比较 Java 中的 UUID
【发布时间】:2014-05-13 08:47:21
【问题描述】:

如果字符串相等,Java 中 String 对象的 UUID 是否相同?如果没有,是否有一种方法/工具来生成字符串(具有正确的 UUID 格式),如果将在相等的字符串上计算,该字符串将保持不变?我需要某种字符串散列,保持 UUID 格式。 Java中有这样的东西吗?

[编辑]: 你可能会问我到底想做什么。我正在制作应用程序的一部分,它将对象从一个服务转换为另一个。其中之一通过 UUID 提供标识对象。第二个不要存储它。我不想缓存这些服务的全部数据,所以我必须以某种方式生成那个 UUID。

【问题讨论】:

  • 您想要一个基于名称的 UUID 吗?如果您使用标准字符集将String 转换为byte[],这将起作用(我现在正在这样做并使用UTF-8)。
  • 错误,UUID 不是哈希...
  • 这里回答了类似的问题:stackoverflow.com/questions/3804591/…
  • 我不明白“我需要某种字符串散列,保持 UUID 格式。”能举个例子吗?

标签: java hash uuid


【解决方案1】:

是的。您只需使用UUID.fromString() 与uuid.toString() 的结果:

UUID id1 = UUID.randomUUID();
String s = id1.toString();
UUID id2 = UUID.fromString(s);

assertTrue(id1, id2);

【讨论】:

    【解决方案2】:

    试试这个

        MessageDigest md = MessageDigest.getInstance("MD5");  
        md.update("test".getBytes());
        byte[] a = md.digest();     // 16 bytes for MD5
        ByteBuffer bb = ByteBuffer.wrap(a);
        long l1 = bb.getLong();
        long l2 = bb.getLong();
        UUID uuid = new UUID(l1, l2);
        System.out.println(uuid);
    

    【讨论】:

      【解决方案3】:

      如果字符串相等,Java 中 String 对象的 UUID 是否相同?

      不,因为这打印错误:

      final String s = "Mémé dans les orties ?";
      final UUID uuid1 = UUID.nameUUIDFromBytes(s.getBytes(StandardCharsets.UTF_8));
      final UUID uuid2 = UUID.nameUUIDFromBytes(s.getBytes(StandardCharsets.UTF_16LE));
      System.out.println(uuid1.equals(uuid2));
      

      您需要将String 编码成一个字节数组,并在两边使用相同的编码。


      更重要的是,UUID 本身并不是一个哈希值;如果您想要 sha1、sha256 等哈希值,请查看 Guava

      【讨论】:

        猜你喜欢
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多