Как мне создать уникальный идентификатор для Map в Java? - PullRequest
3 голосов
/ 08 мая 2019

Я ищу правильный способ создания уникального идентификатора для карты на основе содержимого карты. Итак, я ожидаю, что идентификаторы двух карт, которые содержат одинаковые данные, будут одинаковыми и имеют как можно меньшую вероятность столкновений.

Моя текущая догадка - использовать UUID, записать Map в Object и затем построить UUID из байтов.

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

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

Тем не менее, я хотел спросить, является ли это оптимальным способом, а если нет, то что мне еще попробовать?

1 Ответ

2 голосов
/ 08 мая 2019

Для этого вы можете использовать любую подходящую для ваших нужд (с точки зрения коллизий, производительности) хэш-функцию, например, 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).

...