2010-11-15 68 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