Java 为什么字符串hashCode不';你没有尺寸限制吗?

Java 为什么字符串hashCode不';你没有尺寸限制吗?,java,hash,hashcode,Java,Hash,Hashcode,它困扰了我一段时间,但我还没有找到任何令人信服的答案,那么为什么Java字符串中的hashCode函数没有任何大小限制呢?以下是我发现的实现: 你怎么看?我想到了几个可能的原因: 字符串通常只在开头或结尾变化,例如,所有StackOverflow问题URL都以“”开头。因此,将哈希代码限制为字符的子集将导致不必要的冲突,并且对于某些字符串集,会导致许多冲突。您提出的算法将导致每个stackoverflow问题URL具有相同的哈希代码 hashCode是快速且可记忆的,不清楚将hashCode限制

它困扰了我一段时间,但我还没有找到任何令人信服的答案,那么为什么Java字符串中的
hashCode
函数没有任何大小限制呢?以下是我发现的实现:


你怎么看?

我想到了几个可能的原因:

  • 字符串通常只在开头或结尾变化,例如,所有StackOverflow问题URL都以“”开头。因此,将哈希代码限制为字符的子集将导致不必要的冲突,并且对于某些字符串集,会导致许多冲突。您提出的算法将导致每个stackoverflow问题URL具有相同的哈希代码

  • hashCode是快速且可记忆的,不清楚将hashCode限制在某个恒定长度是否会带来显著的性能改进,特别是因为它总是在创建字符串之前(一个O(n)操作),并且后面经常会调用
    equals
    (也是O(n))

  • 遗留原因。指定使用特定的算法。现有应用程序依赖于此规范。即使这种优化现在被认为是必要的,但在不破坏向后兼容性的情况下也无法实现


  • 如果你用谷歌搜索URL的历史记录,Java以前有一个有限的哈希代码:)通过限制创建哈希代码时要考虑的字符数,您试图解决的问题是什么?@dehasi您在分享的文章中不太清楚,因为URL可能只使用哈希代码,以后没有检查equals,但我明白了,所以谢谢@最终我找到了关于java字符串哈希和URL的故事。这本书是
    编程实践
    章节
    2.9哈希表
    ,Kernighan&Pike.@dehasi谢谢,我检查过了,确实提到了URL示例。谢谢回答。至于#1,我明白了,尽管我认为一些合理的限制,例如1024应该足以解决大多数此类问题。或者是一些奇特的代码,总是有32个字符,但不总是前32个字符。对于较大的字符串,它可以得到第1、第1000、第2000等(可以用模完成)。至于#2,我并不是说它会带来明显的好处,但既然哈希代码是惰性计算的,即使创建的字符串是O(n),那么为什么不使用可能更好的哈希代码实现呢?至于#3,我同意现在改变它可能会有问题,但我只是好奇。无论如何,你总结了两个潜在的原因,所以我会接受你的答案,谢谢!
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    
    int limit = value.length > 32 ? 32 : value.length;
    for (int i = 0; i < limit; i++) {
        h = 31 * h + val[i];
    }