如何为 Java 中的地图创建唯一 ID?
How do I create a unique id for Map in Java?
我正在寻找一种根据地图内容为地图创建唯一 ID 的正确方法。所以,我希望包含相同数据的2张地图的ID也相同,并且冲突的可能性尽可能小。
我目前的猜测是使用 UUID,将 Map 写入 Object,然后从字节构建 UUID。
Map map;
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(map);
out.close();
UUID.nameUUIDFromBytes(byteOut.toByteArray());
但是,我想问问这是否是最佳方式,如果不是,我还应该尝试什么?
为此,您可以使用任何适合您需要(在冲突、性能方面)的哈希函数,例如 SHA-1:
public class MainClas {
public static void main(String[] args) throws NoSuchAlgorithmException {
Map<String, Integer> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
String mapString = map.entrySet().toString();
System.out.println(mapString);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] hashBytes = digest.digest(mapString.getBytes());
String hashString = bytesToHex(hashBytes);
System.out.println(hashString);
}
private static String bytesToHex(byte[] hashInBytes) {
StringBuilder sb = new StringBuilder();
for (byte b : hashInBytes) sb.append(String.format("%02x", b));
return sb.toString();
}
}
输出:
[1=1, 2=2, 3=3]
1a1677fe956c66c776a100b32b0a2b20fdabb5f3
P.S。您可以通过使用不同算法(2 或 3)生成的哈希的复合哈希来最大程度地减少冲突。
我正在寻找一种根据地图内容为地图创建唯一 ID 的正确方法。所以,我希望包含相同数据的2张地图的ID也相同,并且冲突的可能性尽可能小。
我目前的猜测是使用 UUID,将 Map 写入 Object,然后从字节构建 UUID。
Map map;
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(map);
out.close();
UUID.nameUUIDFromBytes(byteOut.toByteArray());
但是,我想问问这是否是最佳方式,如果不是,我还应该尝试什么?
为此,您可以使用任何适合您需要(在冲突、性能方面)的哈希函数,例如 SHA-1:
public class MainClas {
public static void main(String[] args) throws NoSuchAlgorithmException {
Map<String, Integer> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
String mapString = map.entrySet().toString();
System.out.println(mapString);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] hashBytes = digest.digest(mapString.getBytes());
String hashString = bytesToHex(hashBytes);
System.out.println(hashString);
}
private static String bytesToHex(byte[] hashInBytes) {
StringBuilder sb = new StringBuilder();
for (byte b : hashInBytes) sb.append(String.format("%02x", b));
return sb.toString();
}
}
输出:
[1=1, 2=2, 3=3]
1a1677fe956c66c776a100b32b0a2b20fdabb5f3
P.S。您可以通过使用不同算法(2 或 3)生成的哈希的复合哈希来最大程度地减少冲突。