2009-12-06 17 views
5

bir dize olarak verilen verilerin (sha1 veya md5) Mathematica onun Hash fonksiyonu ileKriptografik hash "abc" sha1 hash Mathematica

olduğunu size söyletmeye

a9993e364706816aba3e25717850c26c9cd0d89d 

tek yoldur

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

(çoğu uygulamalar yapmak gibi IntegerString şey hex çıktı bunu yalnızca budur.)

Not

o
Hash["abc", "SHA"] 

"\" abc \ "" komutunu verir - istediğinizi değil! Aslında, "abc" nin doğru karesini alabilmemizin tek nedeni, abc sembolünün Mathematica temsilinin "abc" dizesi olmasıydı. Dizelerin büyük çoğunluğu için durum böyle olmayacaktır.

Mathematica'da rasgele bir dizginin karmaşasını nasıl alırsınız?

+2

Not söyledi. – joebolte

cevap

6

StringToStream'u kullanarak ve FileHash'un argüman olarak bir giriş akışını alabildiği gerçeği daha az kullanabilirsiniz. Sonra sha1 fonksiyonu haline gelir: dizeleri sağlamalarının şimdi diğer dillerde aynıdır böylece Hash Mathematica'nın sürümünde 8 değişti

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

Bu çözüm daha da doğru çünkü 'Hash'' StringToStream' ve 'ToString''nin kendisini Trace [Hash [" abc "," SHA "], _StringToStream | _ToString, TraceInternal -> Doğru]. Ve maalesef Java'yı yoğun olarak kullanıyor ... –

2

İşte çalışan bir kludge. Geçici dosyaya dize yazın ve FileHash kullanın:

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

Ayrıca

hex = IntegerString[#, 16]&; 

tanımlamak ve yukarıdaki işlevinde [email protected] dönmek isteyebilirsiniz.