0

私はこの小さなテストスクリプトを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

次に、WindowsXPでまったく同じスクリプトを実行します。

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

誰かがここで何が問題なのか教えてもらえますか?

4

1 に答える 1

2

JPEG(つまり、バイナリファイル)を開いて、そこからテキストのすべての行を読み取ります。そうしないでください。バイナリデータをテキストとして扱うときはいつでも、奇妙な振る舞いを求めているだけです。

私はRubyについてはまったく知りませんが、通常はファイルを開いて、そこからバイナリデータのチャンクを繰り返し読み取り、それでハッシュを更新することを期待しています。「線」について話したり、テキストを使用したりすることは一切しないでください。

于 2010-11-15T09:55:21.503 に答える