どのように私はJavaで地図の一意のIDを作成するのですか?

ルミナス:

私は、マップの内容に基づいて、地図の一意のIDを作成するための正しい方法を探しています。だから、私は、同じデータが含まれている2つのマップのIDが同様に同じであることと、できるだけ衝突の小さなチャンスとして持っていることを期待しています。

私の現在の推測では、UUIDを使用してオブジェクトに地図を書いた後、バイトからUUIDを構築しています。

 Map map;
 ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
 ObjectOutputStream out = new ObjectOutputStream(byteOut);

 out.writeObject(map);
 out.close();
 UUID.nameUUIDFromBytes(byteOut.toByteArray());

しかし、私はこれが最適な方法であればお聞きしたかったとされていない場合、私は他に何を試してみてください?

マシューI.:

これは、あなたのニーズに合わせて任意の適切なを使用することができます達成するために(衝突の用語で、パフォーマンス)ハッシュ関数、例えば、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)から製造されたハッシュから複合ハッシュを使用して、衝突を最小化することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210463&siteId=1