将字符串哈希到固定位哈希值

时间:2015-07-16 07:38:30

标签: java hash

我想将一个字哈希到固定比特哈希值,比如64比特,32比特(二进制)。

我使用了以下代码

    ...
    Review.create(req.body).then(function(review) {
      review.reviewer = req.user.id;
      review.application = req.params.applicationId;
      return Q.all([
        review.save(),
        User.findByIdAndUpdate(review.reviewer, {$push: {reviews: review._id}}).exec(),
        Application.findByIdAndUpdate(review.application, {$push: {reviews: review._id}}).exec(),
      ]).then(function() {
    ...

然后通过以下函数将murmur_hash值转换为二进制值

   long murmur_hash= MurmurHash.hash64(word);

是否有任何直接哈希方法转换为二进制文件?

3 个答案:

答案 0 :(得分:1)

请使用此

Integer.toBinaryString(int i)

答案 1 :(得分:0)

另一种方法是使用

Integer.toString(i, radix)

你可以得到第二个参数指定的基数(二进制 - 2,八进制 - 8,十进制 - 10,十六进制 - 16)中第一个参数i的字符串表示。

答案 2 :(得分:0)

如果你想转换成一个固定的二进制字符串,也就是说,总是得到一个带有零填充的64个字符的长字符串,那么你有几个选项。如果你有Apache的StringUtils,你可以使用:

StringUtils.leftPad( Long.toBinaryString(murmurHash), Long.SIZE, "0" );

如果不这样做,您可以自己编写填充方法:

public static String paddedBinaryFromLong( long val ) {
    StringBuilder sb = new StringBuilder( Long.toBinaryString(val));
    char[] zeros = new char[Long.SIZE - sb.length()];
    Arrays.fill(zeros, '0');
    sb.insert(0, zeros);
    return sb.toString();
}

此方法首先使用Long.toBinaryString(long)方法,方便您进行位转换。如果值小于64个字符,它唯一不做的就是在左侧填充。

下一步是创建一个0个字符数组,并在左侧填充缺少的零。

最后,我们在StringBuilder的开头插入了零数组,并且我们有一个64个字符的零填充位字符串。

注意:使用Long.toBinaryString(long)Long.toString(long,radix)之间存在差异。差异是负数。在第一个中,您将获得该数字的完整,二进制补码值。在第二个中,您将获得带有减号的数字:

    System.out.println(Long.toString(-15L,2));

结果:

-1111
    System.out.println(Long.toBinaryString(-15L));

结果:

1111111111111111111111111111111111111111111111111111111111110001