String # pack работает на 1,9+, а не на 1,8 * - PullRequest
0 голосов
/ 30 марта 2012

Я наткнулся на ошибку, которую не совсем понимаю.

# Ruby 1.8.7
>> [Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N")
RangeError: bignum too big to convert into 'unsigned long'

# Ruby 1.9.3
>> [Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N")
=> "17!@"

Кто-нибудь может объяснить, почему и как я могу это решить?Если ни одно портативное решение не может быть использовано, мне нужно одно для 1.8.7.

1 Ответ

3 голосов
/ 30 марта 2012

В Ruby 1.8 + , сборка завершается неудачно, если значение слишком велико - но вы можете получить то же поведение, только рассматривая младшие биты, изменив:

[Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N")

до

[Digest::MD5.hexdigest("http://www.google.com").to_i(16) % 2**32].pack("N")
...