“abc”的sha1哈希是
a9993e364706816aba3e25717850c26c9cd0d89d
让Mathematica用Hash
函数告诉你的唯一方法是
Hash[abc, "SHA"] // IntegerString[#, 16]&
(IntegerString就像大多数实现一样以十六进制输出。)
请注意
Hash["abc", "SHA"]
给出了“\”abc \“”的哈希值 - 不是你想要的!
事实上,我们获得正确哈希“abc”的唯一原因是因为符号abc
的Mathematica表示恰好是字符串“abc”。
对于绝大多数字符串,情况并非如此。
那么如何在Mathematica中获取任意字符串的哈希值?
答案 0 :(得分:6)
使用StringToStream
以及FileHash
可以将输入流作为参数这一事实,您可以更少地执行此操作。然后您的sha1
函数变为:
sha1[s_String] := Module[{stream = StringToStream[s], hash},
hash = FileHash[stream,"SHA"];
Close[stream];
hash]
答案 1 :(得分: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
。