2009-12-06 4 views
5

Le sha1 de « abc » esthachage cryptographique (SHA1 ou md5) des données fournies sous forme de chaîne dans Mathematica

a9993e364706816aba3e25717850c26c9cd0d89d 

La seule façon d'obtenir Mathematica pour vous dire que sa fonction Hash est

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

(La chose IntegerString est juste à la sortie en hexadécimal comme la plupart des implémentations font.)

Notez que

Hash["abc", "SHA"] 

donne le hachage de "\" abc \ "" - pas ce que vous voulez! En fait, la seule raison pour laquelle nous pouvions obtenir le hachage correct de "abc" était parce que la représentation Mathematica du symbole abc se trouve être la chaîne "abc". Pour la grande majorité des chaînes, ce ne sera pas le cas.

Alors, comment prenez-vous le hachage d'une chaîne arbitraire dans Mathematica?

+2

Notez que Hash modifié dans la version 8 de Mathematica afin que hash de chaînes sont maintenant les mêmes que dans d'autres langues. – joebolte

Répondre

6

Vous pouvez le faire moins kludgily en utilisant StringToStream et le fait que FileHash peut prendre un flux d'entrée en tant qu'argument. Ensuite, votre fonction sha1 devient:

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

Cette solution est d'autant plus correcte que 'Hash' utilise' StringToStream' et 'ToString' lui-même comme on peut le voir avec' Trace [Hash ["abc", "SHA"], _StringToStream | _ToString, TraceInternal -> True] '. Et malheureusement, il utilise beaucoup Java ... –

2

Voici un kludge qui fonctionne. Ecrire la chaîne à un fichier temporaire et utiliser FileHash:

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

Vous pouvez également définir

hex = IntegerString[#, 16]&; 

et retour [email protected] dans la fonction ci-dessus.