我想在Ruby中生成Java&#39的String.hashCode方法返回的相同哈希码。什么方法最优雅? 这里描述了Java的String hashCode实现:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29
答案 0 :(得分:2)
这是一个简单的实现。
def jhash(str)
result = 0
mul = 1
max_mod = 2**31 - 1
str.chars.reverse_each do |c|
result += mul * c.ord
result %= max_mod
mul *= 31
end
result
end
一些示例运行
jhash("aa")
3104
jhash("")
0
jhash("polygenelubricants") #Java returns -2147483648
1283535072
请注意,java实现返回一个32位宽的int(无符号为31位)。 Java哈希码实现也可以返回负值。此实现不会模仿java的负散列码行为。相反,它将返回0到2之间的整数** 31-1(Integer.MAX_VALUE)
答案 1 :(得分:2)
这是我的版本。它与javascript hashCode相同。 注意32位转换技巧打包和解包:
def hash_code(str)
str.each_char.reduce(0) do |result, char|
[((result << 5) - result) + char.ord].pack('L').unpack('l').first
end
end
答案 2 :(得分:-2)
这是一个返回与java
中的hashCode()相同结果的示例TWO_31 = 2 ** 31
TWO_32 = 2 ** 32
def java_hash_code(str)
size = str.size
hash = 0
str.chars.each_with_index do |ch, i|
hash += ch.ord * (31 ** (size-(i+1)))
hash = hash % TWO_32 - TWO_31
end
hash
end