【发布时间】:2015-03-10 18:24:05
【问题描述】:
我创建了这个函数,当您输入简短的内容时,它的工作原理与原始 Java 函数相同,但如果我输入的内容大于 5-7 个字符 - 那么我会得到一些非常大的数字。 (而不是正确的哈希码)
这里是Java哈希函数的公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
更简单的一种(仅适用于短字符串):
s = "abc" //String
n = 3 //Lenght of the String
s[0] = 'a'. ASCII code of 'a' = 97.
97 * (31 ^ (n - 1))
97 * (31 ^ (2))
97 * 961 = 93217
s[1] = 'b'. ASCII code of 'b' = 98.
98 * (31 ^ (n - 2))
98 * (31 ^ 1)
98 * 31 = 3038
s[2] = 'c'. ASCII code of 'c' = 99.
99 * (31 ^ (n - 3))
99 * (31 ^ 0)
99 * 1 = 99
93217 + 3038 + 99 = 96354 //
我想知道即使我输入一个巨大的字符串,Java 是如何使哈希变小的。
Java's hashcode of "Hello" - 69609650
My hashcode of "Hello" - 69609650
Java's hashcode of "Welcome to Tutorialspoint.com" - 1186874997
My hashcode of "Welcome to Tutorialspoint.com" - 5.17809991536626e+43
如果我们将数字相加,哈希怎么可能是负数?
【问题讨论】: