別にそれほど困った話ではないけど、xyzzyのsha-1,emacsのsha1関数を使った ファイルのチェックサムを求める方法がよく分からない。
テストしたファイルは newLISPv10.1(UTF-8_win32)
SHA1(newlisp.dll)= 5ef2a160350fde6312baa2a6fa3d964c308f7faf
SHA1(newlisp.exe)= 561ff028b606c3671393848e279b845c5fdf60c1
で、以下が結果。
# [cygwin]
/cygdrive/c/Program Files/newlisp$ sha1sum.exe newlisp.exe
561ff028b606c3671393848e279b845c5fdf60c1 *newlisp.exe
;; [xyzzy]
(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe")
(si:sha-1 fp))
;; => "ce3a7fd7fb67ddf2aff136dd1a16b943128b70f5"
;; [emacs]
(require 'sha1)
(with-temp-buffer
(insert-file-contents "c:/Program Files/newlisp/newlisp.exe")
(sha1 (buffer-string)))
;; => "5fc949c2297b7d890e086ec1b0293fb3b33f627b"
見事に3つとも別のハッシュ値が返ってきた。
http://www.newlisp.org/downloads/UTF-8_win32/SHA1.txtを見る限りはcygwinのsha1sum.exeの結果が正しいらしい。じゃあxyzzy,emacsの方は何を間違ったんだろうね。
[追記@2009-07-04T17:47:05]
NANRIさんからのコメントより、xyzzyの方は単なるエンコード指定忘れでした。
(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe"
:encoding :binary)
(si:sha-1 fp))
;; => "561ff028b606c3671393848e279b845c5fdf60c1"
残る問題はNTEmacs。 Emacs@ubuntuで上と同様にチェックサムを求めたら正しい値になりました。 sha1.el(sha1-el.el)を見る限り、それなりにファイルサイズが大きいときは外部プログ ラムsha1sumに処理を投げているようだが...
(つづくかも)
試してませんが、エンコーディングの違いではないでしょうか。
返信削除(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe"
:encoding :binary)
(si:sha-1 fp))
うわぁ…ポカミスでした。指摘ありがとうございます。
返信削除もしくはこれでもありみたいですね
(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe")
(set-stream-encoding fp :binary)
(si:sha-1 fp))
;; => "561ff028b606c3671393848e279b845c5fdf60c1"
NTEmacsでも解決したっぽいのでこちらも参照
返信削除→http://lisperblog.blogspot.com/2010/05/emacssha1-file.html