Cryptographic hash (sha1 or md5) of data given as a string in Mathematica

北战南征 提交于 2019-12-21 17:00:51

问题


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?


回答1:


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]



回答2:


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.



来源:https://stackoverflow.com/questions/1854491/cryptographic-hash-sha1-or-md5-of-data-given-as-a-string-in-mathematica

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!