非空字符串的哈希码是否可以为零?

Den*_*ret 25 java string hash integer-overflow

通过"非空",我的意思是在这个问题中包含至少一个非零字符的字符串.

作为参考,这是hashCode实现:

1493    public int hashCode() {
1494        int h = hash;
1495        if (h == 0) {
1496            int off = offset;
1497            char val[] = value;
1498            int len = count;
1499
1500            for (int i = 0; i < len; i++) {
1501                h = 31*h + val[off++];
1502            }
1503            hash = h;
1504        }
1505        return h;
1506    }
Run Code Online (Sandbox Code Playgroud)

并且算法在文档中指定.

在发生整数溢出之前,答案很简单:它不是.但我想知道的是,由于整数溢出,非空字符串的哈希码是否可能为零?你能建一个吗?

我正在寻找的理想情况是数学演示(或链接到一个)或构造算法.

Mic*_*rdt 36

当然.例如,字符串f5a5a608的哈希码为零.

我发现通过一个简单的蛮力搜索:

public static void main(String[] args){
    long i = 0;
    loop: while(true){
        String s = Long.toHexString(i);
        if(s.hashCode() == 0){
            System.out.println("Found: '"+s+"'");
            break loop;
        }
        if(i % 1000000==0){
            System.out.println("checked: "+i);              
        }
        i++;
    }       
}
Run Code Online (Sandbox Code Playgroud)

编辑:在JVM上工作的Joseph Darcy甚至编写了一个程序,它可以通过基本上反向运行哈希算法来构造一个带有给定哈希码的字符串(以测试switch/case语句中字符串的实现).

  • "我亲爱的,激励,我不会贬低亵渎.Hashcodes为零.有很多.可以这样想,你有一个大约2 ^ -64的机会,一个String将散列为零.然后想想有多少可能的字符串. (5认同)