2012-03-30 225 views
0

我偶然發現了一個我不太明白的錯誤。字符串#包工作在1.9+,而不是1.8 *

# 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") 
=> "[email protected]" 

任何人都可以解釋爲什麼,我該如何解決這個問題?如果沒有便攜式解決方案可以使用,我需要一個1.8.7。

+0

你想要什麼.pack('N')?縮短結果? – karatedog 2012-03-30 13:53:55

+0

是的,我使用https://github.com/technoweenie/guillotine/blob/master/lib/guillotine.rb – ksol 2012-03-30 13:57:10

+0

的代碼片段,然後與Said的建議一起使用。 (「N」)只會取最後的32位,所以模數不會改變結果。 – karatedog 2012-03-30 15:54:15

回答

3

紅寶石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") 
相關問題