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