Предположим, у меня есть какой-нибудь «длинный» хэш, например 16-байтовый MD5 или 20-байтовый SHA1. Я хочу уменьшить этот хэш до 4 байтов для целей GetHashCode()
.
Во-первых, я прекрасно понимаю, что у меня будет больше столкновений. В моем случае это совершенно нормально, но я бы все же предпочел получить меньше возможных столкновений.
Есть несколько решений моей проблемы:
- Я мог бы взять 4 первых байта хеша.
- Я мог бы взять 4 последних байта хеша.
- Я мог взять 4 случайных байта хеша.
- Я мог бы сгенерировать хэш хэша, используя классические умножения простых чисел.
Есть ли другие решения, о которых я не подумал? И что еще более важно, какой метод даст мне самый уникальный хэш-код? В настоящее время я предполагаю, что они почти эквивалентны.
Microsoft решила, что токен открытого ключа сборки — это последние 8 байтов хэша SHA1 его открытого ключа, поэтому я, вероятно, выберу это решение, но я хотел бы знать, почему.