5

"abc" 的 sha1 哈希是

a9993e364706816aba3e25717850c26c9cd0d89d

让 Mathematica 告诉你它的Hash功能的唯一方法是

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

( IntegerString 只是像大多数实现一样以十六进制输出它。)

注意

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

这是一个有效的kludge。将字符串写入临时文件并使用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 回答