繁体   English   中英

如何使用Ruby生成Java的String hashCode

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM