Как «уменьшить» хеш? - PullRequest
3 голосов
/ 13 июня 2010

Предположим, у меня есть "длинный" хеш, например, 16-байтовый MD5 или 20-байтовый SHA1. Я хочу уменьшить этот хеш до 4 байтов для целей GetHashCode().

Во-первых, я прекрасно знаю, что получу больше столкновений. Это совершенно нормально в моем случае, но я все же предпочел бы получить как можно меньше столкновений.

Есть несколько решений моей проблемы:

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

Есть ли другие солютоны, о которых я не думал? И что еще более важно, какой метод даст мне самый уникальный хэш-код? В настоящее время я предполагаю, что они почти эквивалентны.

Microsoft решила, что токен открытого ключа сборки - это последние 8 байтов хеша SHA1 ее открытого ключа, поэтому я, вероятно, пойду к этому решению, но мне хотелось бы знать, почему.

Ответы [ 5 ]

8 голосов
/ 13 июня 2010

Любой хэш - это уже сокращение.

Криптографические хэши спроектированы таким образом, что ни одна часть данных не имеет большего влияния на какую-либо часть хэша, чем любая другая. Поэтому не имеет значения, какие биты хеша вы выберете.

5 голосов
/ 13 июня 2010

Любая опция, кроме третьей - выбор байтов случайным образом - работает нормально.Если вы выбираете байты случайным образом, один и тот же вход каждый раз будет генерировать разные хеш-коды, что противоречит цели хеш-кода.

1 голос
/ 13 июня 2010

Если вы выберете случайные 4 байта, то вы получите ситуацию, когда два ваших хэша SHA1, которые абсолютно одинаковы, производят разные хеш-коды GetHashCode.

Я бы просто выбрал первые 4 байта - разработан SHA1так что никакие байты не должны быть такими важными, как любой другой набор байтов.

0 голосов
/ 13 июня 2010

Если ваш текущий хеш хранится в виде строки, просто вызовите GetHashCode для этой строки, и он вернет вам int, 4 байта.

Любое использование?

0 голосов
/ 13 июня 2010

Если у вас есть разумное количество хэшей, проиндексируйте их (например, сохраните в базе данных):

1 - 987baf9gfd79b7979debe90085eadf5
2 - 9754gccgfd79s7979abbc90085eadf5
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...