如何在Java中为Map创建唯一的ID?

前端之家收集整理的这篇文章主要介绍了如何在Java中为Map创建唯一的ID? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在寻找一种基于地图内容为地图创建唯一ID的正确方法.因此,我希望包含相同数据的2个地图的ID相同,并且发生碰撞的可能性尽可能小.

我目前的猜测是使用UUID,将Map写入Object,然后从字节构建UUID.

  1. Map map;
  2. ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
  3. ObjectOutputStream out = new ObjectOutputStream(byteOut);
  4. out.writeObject(map);
  5. out.close();
  6. UUID.nameUUIDFromBytes(byteOut.toByteArray());

但是,我想问一下这是否是最佳方法,是否应该尝试其他方法

最佳答案
为此,您可以使用任何适合您的需求(就冲突,性能而言)的哈希函数,例如SHA-1:

  1. public class MainClas {
  2. public static void main(String[] args) throws NoSuchAlgorithmException {
  3. Map<String,Integer> map = new HashMap<>();
  4. map.put("1",1);
  5. map.put("2",2);
  6. map.put("3",3);
  7. String mapString = map.entrySet().toString();
  8. System.out.println(mapString);
  9. MessageDigest digest = MessageDigest.getInstance("SHA-1");
  10. byte[] hashBytes = digest.digest(mapString.getBytes());
  11. String hashString = bytesToHex(hashBytes);
  12. System.out.println(hashString);
  13. }
  14. private static String bytesToHex(byte[] hashInBytes) {
  15. StringBuilder sb = new StringBuilder();
  16. for (byte b : hashInBytes) sb.append(String.format("%02x",b));
  17. return sb.toString();
  18. }
  19. }

输出

  1. [1=1,2=2,3=3]
  2. 1a1677fe956c66c776a100b32b0a2b20fdabb5f3

附言您可以通过使用由不同算法(2或3)产生的哈希值构成的复合哈希值来最大程度地减少冲突.

猜你在找的Java相关文章