5

「abc」のsha1ハッシュは

a9993e364706816aba3e25717850c26c9cd0d89d

Mathematica にそのHash関数でそれを伝える唯一の方法は

Hash[abc, "SHA"]   // IntegerString[#, 16]&

(IntegerString は、ほとんどの実装と同様に 16 進数で出力するだけです。)

ご了承ください

Hash["abc", "SHA"]

"\"abc\"" のハッシュを与える -- あなたが望むものではない! 実際、「abc」の正しいハッシュを得ることができた唯一の理由は、記号の Mathematica 表現がabcたまたま文字列「abc」だったからです。大多数の文字列では、これは当てはまりません。

では、Mathematica で任意の文字列のハッシュをどのように取得するのでしょうか?

4

2 に答える 2

6

入力ストリームを引数として取るStringToStreamことができるという事実とを使用することで、より簡単に行うことができます。FileHash次に、sha1関数は次のようになります。

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]
于 2009-12-07T18:51:00.110 に答える
2

これが機能するクラッジです。文字列を一時ファイルに書き込み、次を使用しますFileHash

sha1[s_String] := Module[{stream, file, hash},
  stream = OpenWrite[];
  WriteString[stream, s];
  file = Close[stream];
  hash = FileHash[file, "SHA"];
  DeleteFile[file];
  hash]

定義することもできます

hex = IntegerString[#, 16]&;

hex@hash上記の関数で戻ります。

于 2009-12-06T06:02:35.903 に答える