当前位置: 首页 > 面试题库 >

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

宋奇希
2023-03-14
问题内容

我所说的“非空”是指至少包含一个非零字符的字符串。

供参考,这里是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    }

并且算法在文档中指定。

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

理想情况下,我正在寻找的是数学演示(或指向其中的链接)或构造算法。


问题答案:

当然。例如,字符串 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++;
    }       
}

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



 类似资料:
  • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

  • 问题内容: 在过去的一个小时中,我已经阅读了很多文章,但是对于在Hashmap中使用不可变对象作为键的概念,我仍然不太清楚。我有一个哈希图,其键为字符串。哈希图中的值是MyStore,其中MyStore表示有关我拥有的商店的信息。字符串代表地址。在我的代码中,我拥有的逻辑是,我首先在映射中查找该键(如果存在)->获取其值,如果不存在,则将其放入哈希映射。我的经理刚刚告诉我,密钥会在将来发生变化,也

  • 说到什么是字符串哈希(Hash)?很多人都会疑惑,我们可以这么理解,定义一个把字符串映射到整数的函数 f,这个 f 称为是Hash函数。而我们希望这个函数 f 可以方便地帮我们判断两个字符串是否相等。 (1)Hash 的思想 Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 (2)使用场景 当一个字符串规模很大,并且需要多次访问该字符串或者子串的时候,我们可以用哈希函数对每

  • 问题内容: 我想知道如何手动计算给定字符串的哈希码。我了解在Java中,您可以执行以下操作: 一切都很好,但我想知道如何手工完成。我知道给定的公式来计算字符串的哈希码是这样的: 其中,S表示字符串中的字符,n是字符串的长度。然后使用16位unicode,来自字符串me的第一个字符将计算为: 然而,这产生了惊人的数量。我无法想象像这样将所有字符加在一起。那么,为了计算最低阶的32位结果,我该怎么办?

  • 问题内容: 有什么方法可以在Java中使用字符串的哈希码,然后重新创建该字符串? 例如这样的事情: 我之所以这样说,是因为我必须将字符串转换为整数值,然后从该整数值重构该字符串。 问题答案: 这是不可能的。String的哈希码是有损的;许多字符串值将导致相同的哈希码。一个整数有32个位,每个位置有两个值。即使是32个字符的字符串(例如,每个字符都有很多可能性)也无法映射为32位而不会发生冲突。他们

  • 问题内容: 我最近在这里阅读了一些有关Java String类的哈希码的信息,但我一直找不到这样的信息:当字符串的长度大于32时会发生什么(我知道会发生溢出,但是将其作为哈希键) , 怎么了)?例如,我需要对长度在20到120个字符之间的字符串进行哈希处理,才能将它们用作哈希键。我需要使用BigInteger实现自己的算法吗? 另外,由于我可能有30k到80k之间的字符串,也许更多,通常的Stri