2009-12-06 11 views
5

El hash SHA1 de "abc" eshash criptográfica (SHA1 o MD5) de los datos dados como una cadena en Mathematica

a9993e364706816aba3e25717850c26c9cd0d89d 

La única manera de conseguir Mathematica para dirá que con su función Hash es

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

(lo IntegerString es sólo para la salida en hexadecimal como la mayoría de las implementaciones lo hacen.)

Tenga en cuenta que

Hash["abc", "SHA"] 

da el hash de "\" abc \ "" - ¡no es lo que quieres! De hecho, la única razón por la que pudimos obtener el hash correcto de "abc" fue porque la representación de Mathematica del símbolo abc pasa a ser la cadena "abc". Para la gran mayoría de cadenas, este no será el caso.

Entonces, ¿cómo se toma el hash de una cadena arbitraria en Mathematica?

+2

Tenga en cuenta que Hash cambió en la versión 8 de Mathematica para que los hashes de las cadenas son ahora los mismos que en otros idiomas. – joebolte

Respuesta

6

Puede hacerlo menos kludgily usando StringToStream y el hecho de que FileHash puede tomar un flujo de entrada como argumento. Luego, su función se convierte en sha1:

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

Esta solución es aún más correcta porque 'Hash' usa' StringToStream' y 'ToString' como se puede ver con' Trace [Hash ["abc", "SHA"], _StringToStream | _ToString, TraceInternal -> True] '. Y desafortunadamente usa Java extensivamente ... –

2

Aquí hay un kludge que funciona. Escribe la cadena en un archivo temporal y utilizar FileHash:

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

También puede ser que desee para definir

hex = IntegerString[#, 16]&; 

y volver [email protected] en la función anterior.

Cuestiones relacionadas