64-битный MessageDigest - хранить короткие тексты как долго - PullRequest
1 голос
/ 01 июня 2010

Я хочу представить короткие тексты (то есть слово, пару слов) как 64-битный хеш (хочу сохранить их как длинные)

MessageDigest.getInstance ("MD5") возвращает 128 бит.

Есть ли что-нибудь еще, что я мог бы использовать, могу ли я снять с него половину? Я не беспокоюсь о том, что кто-то пытается дублировать хеш, я хотел бы свести к минимуму количество столкновений (две разные строки имеют одинаковый хеш)

Ответы [ 5 ]

2 голосов
/ 01 июня 2010

Вы можете просто использовать любую часть MD5-хеша.

Мы пытались объединить 128-битные в 64-битные с помощью различных алгоритмов, но действие сворачивания не имело никакого заметного различия в распределении хэшей.

Почему бы вам просто не использовать hashCode () из String? Мы хэшировали 8 миллионов адресов электронной почты в 32-разрядное целое число, и на самом деле коллизий с MD5 больше, чем String hashCode. Вы можете запустить hashCode дважды (вперед и назад) и сделать его 64-битным.

2 голосов
/ 01 июня 2010

MD5 (и SHA) хэш "размазывает" данные равномерно по хешированному значению, поэтому любые 64-битные значения yu, выбранные из конечного значения, будут столь же чувствительны к изменению, как и любые другие 64-битные значения Ваша единственная забота будет о повышенной вероятности столкновений.

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

Как криптографический хеш (даже один из которых в настоящее время считается битым), MD5 не имеет значительной корреляции между входными и выходными битами. Это означает, что простое взятие первой или последней половины даст вам прекрасно распределенную хеш-функцию. Все остальное никогда бы не было всерьез рассмотрено как криптографический хеш.

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

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

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

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

А как насчет использования блочного шифра с размером блока 64 бита?

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