对字符串哈希函数感到困惑



当我浏览一些字符串哈希函数时,我发现了这个函数(下面的代码(。该函数一次处理四个字节的字符串,并将四个字节块中的每一个解释为单个长整数值。四个字节块的整数值相加在一起。最后,使用模算子将得到的和转换为0到M-1的范围。以下是功能代码:

// Use folding on a string, summed 4 bytes at a time
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 c[] = s.substring(intLength * 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;

据我所知,这一行中使用的子字符串函数以:beginIndex(包括首尾两个(,子字符串将从指定的beginIndex开始,并扩展到字符串的末尾。为了举例,让我们假设我们想要散列以下字符串:aaaabbb。在这种情况下,intLength将是2(函数代码的第二行(。替换s.substring(intLength * 4).toCharArray()中的intlength值将得到s.substring(8).toCharArray(),这意味着如果要哈希的字符串有8个字符,则字符串索引越界。我不太明白发生了什么事!

这个散列函数很糟糕,但要回答您的问题:

没有IndexOutOfBoundsException,因为"aaaabbbb".substring(8)""

最后一个循环的目的是处理字符串长度不是4的倍数时的剩余部分。例如,当s"aaaabbbbcc"时,则intLength == 2,并且s.substring(8)"cc"

相关内容

最新更新