Archive for 7 月, 2008

7 月 02 2008

JavaのString#hashCode()をRubyで再現

Published by haga under ruby

Javaで作ってあるアプリをiPhoneに移植しようと思ったが、まずObjective-Cがわからないので、Rubyに移植してみようと考えた。

移植元のアプリの中でさらっとString#hashCode()を使っていて困った。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#hashCode()

この文字列のハッシュコードを返します。String のハッシュコードは、次の方法で計算します。 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

上記の通りの計算をしてもRubyでは同じ数値にならない。 どうもJavaのintとRubyのIntegerは挙動が違うからのようだ。

java のInteger int 最大値超えるとどうなるの<br/> http://becomehappy.orz.hm/smithlog/article.php?id=370

Javaのintは-0x80000000~0x7fffffffの間をぐるぐるループしているらしい。<br/> 最大値(2147483647)を超えたら最小値(-2147483648)に戻してやる気遣いが必要だ。

というわけで作ってみたのが下記。

hashcode_gen.rb

#!/usr/bin/env ruby

module EmurateJavaStringHashCode   def to_hashcode     max = 2 ** 31 - 1 # Javaのint最大値     min = -2 ** 31 # Javaのint最小値     h = 0     n = self.size     n.times do |i|       h = 31 * h + self[i]   [...]

No responses yet