Como faço para criar uma identificação única para o mapa em Java?

luminous:

Eu estou procurando uma maneira correta de criar um ID único para Mapa com base no conteúdo do mapa. Então, espero que IDs de 2 mapas que contêm os mesmos dados a ser o mesmo bem e têm como pequena chance de colisões possíveis.

Meu palpite atual está usando UUID, escrevendo Mapa em objetos e, em seguida, construir UUID de bytes.

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

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

No entanto, eu queria perguntar se este é o melhor caminho e se não for o que mais eu deveria tentar?

Mateus I.:

Para conseguir isso, você pode usar qualquer adequado para suas necessidades (em termos de colisões, performance) função hash, por exemplo, 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();
    }
}

resultado:

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

PS pode minimizar colisões usando um hash composto de hash produzidos a partir de algoritmos diferentes (2 ou 3).

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=210461&siteId=1
Recomendado
Clasificación