我有一个来自MD5 JAVA方法的16byte数组。 我想将它转换为long以用作hashkey。 我正在读取一点点XOR,比特为64是一个好主意......那么如何从中获得很长时间?完整的代码示例XOR和cvt to long please。
答案 0 :(得分:4)
我找到的最佳解决方案(基于我的需求......速度和良好的哈希函数的混合)是Google的CityHash。输入可以是包含MD5结果的任何字节数组,输出是无符号的64位长。
CityHash有一个非常好但不完美的哈希分布,并且非常快。
我在半小时内将CityHash从C ++移植到C#。 Java端口也应该很简单。
只是对比特进行异或运算并不能提供良好的分布(尽管可以肯定会非常快)。
我对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;
注意我没有尝试处理endianness。但是,如果您只关心一致的哈希值,那么字节顺序无关紧要。
答案 1 :(得分:2)
为了清楚起见,加密摘要的任何子部分都不再具有摘要的许多加密属性,特别是这些属性不再适用:
答案 2 :(得分:2)
Guava有一些非常好的Hashing capabilities:
Hashing.md5().hashString(s).asLong();
我相信上面的内容实际上是CityHash,但无论它是否会产生散列长度,你可以用它来满足你的散列需求。 (我试过@Eric J. Java代码,它看起来像CityHash 32)。