![](/img/trans.png)
[英]How to generate java's hashcode method in intellij with its members sorted?
[英]How to generate Java's String hashCode using Ruby
我想在Ruby中生成Java的String.hashCode方法返回的相同哈希码。 哪种方法最优雅? 此处介绍了Java的String hashCode实现: http : //docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29
这是一个简单的实现。
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)之间的整数
这是我的版本。 它与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
此示例返回与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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.