Mathematica 中以字符串形式给出的数据的加密哈希(sha1 或 md5)

发布于 2024-08-13 20:01:31 字数 484 浏览 2 评论 0原文

“abc”的 sha1 哈希是

a9993e364706816aba3e25717850c26c9cd0d89d

让 Mathematica 告诉您其 Hash 函数的唯一方法是

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

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

请注意,

Hash["abc", "SHA"]

给出“abc”的哈希值——不是你想要的! 事实上,我们能够获得正确的“abc”散列的唯一原因是符号 abc 的 Mathematica 表示恰好是字符串“abc”。 对于绝大多数字符串来说,情况并非如此。

那么如何在 Mathematica 中获取任意字符串的哈希值呢?

The sha1 hash of "abc" is

a9993e364706816aba3e25717850c26c9cd0d89d

The only way to get Mathematica to tell you that with its Hash function is

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

(The IntegerString thing is just to output it in hex like most implementations do.)

Note that

Hash["abc", "SHA"]

gives the hash of "\"abc\"" -- not what you want!
In fact, the only reason we could get the correct hash of "abc" was because the Mathematica representation of the symbol abc happens to be the string "abc".
For the vast majority of strings, this will not be the case.

So how do you take the hash of an arbitrary string in Mathematica?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嘿咻 2024-08-20 20:01:31

通过使用 StringToStream 以及 FileHash 可以将输入流作为参数,您可以不那么笨拙地完成此操作。那么你的 sha1 函数就变成了:

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]

You can do it less kludgily by using StringToStream and the fact that FileHash can take an input stream as an argument. Then your sha1 function becomes:

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]
药祭#氼 2024-08-20 20:01:31

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

Here's a kludge that works. Write the string to a temp file and use FileHash:

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

You might also want to define

hex = IntegerString[#, 16]&;

and return hex@hash in the above function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文