【问题标题】:Find min/max hashCode values for string of a certain length查找特定长度的字符串的最小/最大 hashCode 值
【发布时间】:2016-06-21 04:24:08
【问题描述】:

有没有一种方法可以使用 Java 的 .hashCode() 方法计算一定长度的字符串的最小/最大哈希码?

来自docs,使用的算法是:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

...它返回一个int,它可能是正数或负数。

由于它添加了所有字符来计算哈希,我尝试通过在由最小/最大字符值组成的相同长度的字符串上运行 .hashCode() 来找到最小/最大哈希 (space = 32 , ~ = 126),但我得到的 s 的值超出了我的最小/最大哈希值的范围。

int s =       "hello world".hashCode();  // 1794106052

// strings the same len as "s"
int minHash = "           ".hashCode();  // 2142006304
int maxHash = "~~~~~~~~~~~".hashCode();  // -2034832962

// hash for s i

【问题讨论】:

    标签: java hash range


    【解决方案1】:

    如果字符串长度至少为 6,则可能的最小 hashCode 为 Integer.MIN_VALUE,最大 hashCode 为 Integer.MAX_VALUE

    即有一个长度为6的字符串,其hashCode为Integer.MIN_VALUE,一个长度为6的字符串,其hashCode为Integer.MAX_VALUE

    您看到整数溢出,这与 hashCode 的预期相同。

    【讨论】:

    • 啊哈!这很有意义(我认为它溢出了,只是不知道在哪里。)你能告诉我为什么会发生在 6 个字符而不是 5 或 7 个字符吗?
    • 第一个 n 其中 126 * 31^(n-1) > Integer.MAX_VALUE 是 6。
    • 明白了。以及如何计算少于 6 个字符的字符串的最小/最大哈希值?
    • 你做的方式应该足够了,只需明确插入最小和最大字符串。 (所有这一切都说:哈希码在整体上比较“大于”或“小于”确实没有意义。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多