Криптографический хэш (sha1 или md5) данных, представленных в виде строки в системе Mathematica.

Хэш sha1 "abc"

a9993e364706816aba3e25717850c26c9cd0d89d

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

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

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

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

Hash["abc", "SHA"]

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

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


person dreeves    schedule 06.12.2009    source источник
comment
Обратите внимание, что Hash изменился в версии 8 Mathematica, так что хэши строк теперь такие же, как и в других языках.   -  person joebolte    schedule 13.02.2012


Ответы (2)


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

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]
person Pillsy    schedule 07.12.2009
comment
Это решение еще более правильное, потому что Hash использует StringToStream и ToString, как можно видеть с Trace[Hash["abc", "SHA"], _StringToStream | _ToString, TraceInternal -> True]. И, к сожалению, он широко использует Java... - person Alexey Popkov; 17.08.2011

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

person dreeves    schedule 06.12.2009