Конвертировать MD5 в Long - PullRequest
2 голосов
/ 12 марта 2012

У меня есть 16-байтовый массив из метода MD5 JAVA. Я хочу преобразовать его в long для использования в качестве хеш-ключа. Читаю побитовый XOR биты до 64 - это хорошая идея ... тогда как получить длинную от этого? полный пример кода XOR и cvt to long, пожалуйста.

Ответы [ 3 ]

4 голосов
/ 12 марта 2012

Самое лучшее решение, которое я нашел (исходя из моих потребностей ... сочетание скорости и хорошей хэш-функции), - это CityHash от Google. На входе может быть любой байтовый массив, включая результат MD5, а на выходе - 64-битная длина без знака.

CityHash имеет очень хорошее, но не идеальное распределение хэшей и очень быстр.

Я портировал CityHash с C ++ на C # за полчаса. Порт Java тоже должен быть простым.

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

Я недостаточно знаком с Java, чтобы точно сказать вам, как заполнить long из байтового массива (может быть хороший помощник, с которым я не знаком, или я мог бы неправильно получить некоторые детали арифметики в Java) , По сути, вы захотите сделать что-то так:

long a = md5[0] * 256 * md5[1] + 256 * 256 * md5[2] + 256 * 256 * 256 * md5[3];
long b = md5[4] * 256 * md5[5] + 256 * 256 * md5[6] + 256 * 256 * 256 * md5[7];
long result = a ^ b;

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

2 голосов
/ 18 октября 2013

У Гуавы есть несколько очень хороших возможностей хеширования :

Hashing.md5().hashString(s).asLong();

Я считаю, что вышеизложенное на самом деле является CityHash, но, несмотря на это, оно генерирует длинные значения хеш-функции, которые вы можете использовать для любых своих нужд хеширования.(Я попробовал @Eric J. Java-код, и он выглядит как CityHash 32).

2 голосов
/ 13 марта 2012

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

  • Инверсионное сопротивление (поиск X, удовлетворяющего XH (X))
  • Сопротивление столкновению (нахождение X, Y такое, что H (X) = H (Y))
  • Случайное распределение по диапазону возможных выходов
...