2010-11-15 66 views
0

我用Ruby寫了這個小測試腳本(在MacOS):Ruby和SHA256 - MacOS和Windows之間的區別?

#!/usr/bin/ruby 
require 'digest/sha2' 

def calc_sha(file) 
    # calc hash 
    hash = Digest::SHA2.new 
    File.open(file, 'r') do |fh| 
    fh.each_line do |l| 
     hash << l 
    end 
    end 

    hash.to_s 
end 

puts calc_sha('dont-panic.jpeg') 
puts '40075d8441ab6a9abeceb7039552704320f471667b8f9ac3c18b9b5b0a1fee7e' 
puts calc_sha('dont-panic.jpeg') == '40075d8441ab6a9abeceb7039552704320f471667b8f9ac3c18b9b5b0a1fee7e' 

其輸出(在MacOS):

~/shatest $ ./sha.rb 
40075d8441ab6a9abeceb7039552704320f471667b8f9ac3c18b9b5b0a1fee7e 
40075d8441ab6a9abeceb7039552704320f471667b8f9ac3c18b9b5b0a1fee7e 
true 

然後我在Windows XP上運行完全相同的腳本:

F:\shatest>ruby sha.rb 
9c787b71392551238b24915c888dbd44f4ff465c8e8aadca7af3bb6aaf66a3ca 
40075d8441ab6a9abeceb7039552704320f471667b8f9ac3c18b9b5b0a1fee7e 
false 

任何人都可以告訴我這是什麼問題嗎?

回答

2

您正在打開JPEG(即二進制文件),然後從中讀取每行文本行。不要這樣做。每當你將二進制數據視爲文本時,你只是要求奇怪的行爲。

我不知道很多關於Ruby可言,但我一般會期望打開該文件,並反覆閱讀,從它二進制數據塊,更新與哈希值。不要做任何談論「線條」或使用文字的東西。

+0

thx!解決了這個問題。 – DiegoFrings 2010-11-15 10:03:34

+1

我現在在使用:Digest :: SHA256.file('dont-panic.jpeg')。hexdigest ...看起來像是一種更好的二進制文件方法 – DiegoFrings 2010-11-15 10:04:38