将MD5转换为Long

时间:2012-03-12 02:56:56

标签: java bit-manipulation long-integer xor

我有一个来自MD5 JAVA方法的16byte数组。 我想将它转换为long以用作hashkey。 我正在读取一点点XOR,比特为64是一个好主意......那么如何从中获得很长时间?完整的代码示例XOR和cvt to long please。

3 个答案:

答案 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)

为了清楚起见,加密摘要的任何子部分都不再具有摘要的许多加密属性,特别是这些属性不再适用:

  • 反转阻力(找到满足H(X)的X)
  • 抗碰撞性(发现X,Y使得H(X)= H(Y))
  • 在可能的输出范围内随机分布

答案 2 :(得分:2)

Guava有一些非常好的Hashing capabilities

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

我相信上面的内容实际上是CityHash,但无论它是否会产生散列长度,你可以用它来满足你的散列需求。 (我试过@Eric J. Java代码,它看起来像CityHash 32)。