如何使用Ruby生成Java的String hashCode

时间:2014-03-30 04:28:41

标签: java ruby string hashcode

我想在Ruby中生成Java&#39的String.hashCode方法返回的相同哈希码。什么方法最优雅? 这里描述了Java的String hashCode实现:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29

3 个答案:

答案 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