Криптографический хеш (sha1 или md5) данных, представленных в Mathematica как строка - PullRequest
5 голосов
/ 06 декабря 2009

хэш sha1 "abc" равен

a9993e364706816aba3e25717850c26c9cd0d89d

Единственный способ заставить Mathematica сказать вам, что с его Hash функцией является

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

(IntegerString просто выводит его в шестнадцатеричном виде, как это делают большинство реализаций.)

Обратите внимание, что

Hash["abc", "SHA"]

дает хэш "\" abc \ "" - не то, что вы хотите! Фактически, единственная причина, по которой мы смогли получить правильный хэш «abc», заключалась в том, что представление Mathematica символа abc оказалось строкой «abc». Для подавляющего большинства строк это будет не так.

Так как же взять хеш произвольной строки в Mathematica?

Ответы [ 2 ]

6 голосов
/ 07 декабря 2009

Вы можете сделать это менее хитроумно, используя StringToStream и тот факт, что FileHash может принимать входной поток в качестве аргумента. Тогда ваша sha1 функция становится:

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]
2 голосов
/ 06 декабря 2009

Вот клудж, который работает. Запишите строку во временный файл и используйте 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 в вышеуказанной функции.

...