簡體   English   中英

如何在Java中為Map創建唯一的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

PS你可以通過使用從不同算法(2或3)產生的散列的復合散列來最小化沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM