我在Ruby中编写了这个小测试脚本(在MacOS上):
#!/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
谁能告诉我这里的问题是什么?
答案 0 :(得分:2)
您正在打开 JPEG (即二进制文件),然后从中读取每个文本行。不要那样做。每当你将二进制数据视为文本时,你只是要求奇怪的行为。
我根本不太了解Ruby,但我通常希望打开文件,并反复从中读取二进制数据的块,然后用它更新哈希。不要做任何谈论“行”或使用文本的事情。