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

我正在寻找一种基于地图内容为地图创建唯一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();
    }
}

输出:

扫描二维码关注公众号,回复: 8516082 查看本文章
[1=1, 2=2, 3=3]
1a1677fe956c66c776a100b32b0a2b20fdabb5f3

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

发布了540 篇原创文章 · 获赞 0 · 访问量 1986

猜你喜欢

转载自blog.csdn.net/weixin_44109689/article/details/103916910