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).