我的问题与代码有关,该代码生成字符串的哈希值,一次累加4个字节。它完全可以正常工作,但是我无法理解这段代码的某些行,即在某些行中执行的想法。因此,我需要一些熟悉哈希的人的帮助。

好吧,这是完整的代码:

long sfold(String s, int M) {
 int intLength = s.length() / 4;
 long sum = 0;
 for (int j = 0; j < intLength; j++) {
   char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
   long mult = 1;
   for (int k = 0; k < c.length; k++) {
 sum += c[k] * mult;
 mult *= 256;
   }
 }

 char c[] = s.substring(intLength * 4).toCharArray();
 long mult = 1;
 for (int k = 0; k < c.length; k++) {
   sum += c[k] * mult;
   mult *= 256;
 }

 return(Math.abs(sum) % M);


}

在这里,每个char值都转换为长整数类型,对for循环的每次迭代求和。我上面提到的这2条令人怀疑的代码行如下:

sum += c[k] * mult;
mult *= 256;


好吧,我可以理解整个代码,除了这两行...

1)为什么需要变量“ mult”?可能是乘法使用散列法吗?

2)为什么每次迭代都将“ mult”精确乘以256?在这种情况下256是多少?

如果您中的某些人已经遇到了此代码,或者您知道在这些行中执行的想法,请也帮助我理解它:)

最佳答案

由于c[k]是char的事实,它的大小为8位,而8位恰好是256个可能的数字。例如,我们有char[] c = new char[]{'a, 'b', 'c', 'd'},这里的'a'有点像10000001,而b就像10000010,依此类推。现在的问题是,我们如何形成sum,首先我们只按位获取a表示,因此sum成为10000001,接下来我们将b以位明智的形式乘以256实际上,这只是向左移8位的逐位移位,这意味着'b' * 25610000001 * 100000000 = 1000000100000000相同(256位形式为100000000),现在当我们将此'b' * 256与先前的总和相加时,这意味着只需用a位形式替换最后8位。接下来发生同样的事情。

因此,最后我们只收到一个数字,该数字是我们之前的char(例如10000001 10000010 10000011 10000100)的按位连接。

我希望这会有所帮助。

关于java - Java中的字符串散列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17260134/

10-12 00:37
查看更多