2009-12-06 18 views
5

的「ABC」 SHA1哈希數據(SHA1或MD5)是加密哈希作爲字符串給出數學

a9993e364706816aba3e25717850c26c9cd0d89d 

只有這樣,才能獲得數學告訴你,與其Hash功能

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

(該IntegerString的事情就是將其輸出到十六進制最喜歡做的實現。)

注意

Hash["abc", "SHA"] 

給出了散列「\」abc \「」 - 不是你想要的! 實際上,我們可以得到正確的「abc」散列的唯一原因是因爲符號abc的Mathematica表示恰好是字符串「abc」。 對於絕大多數字符串,情況並非如此。

那麼如何在Mathematica中使用任意字符串的散列?

+2

需要注意的是哈希Mathematica中的8版本更改,以便串的散列現在一樣的在其他語言。 – joebolte 2012-02-13 10:56:53

回答

6

通過使用StringToStream以及FileHash可以將輸入流作爲參數這一事實,您可以更輕鬆地做到這一點。然後你sha1函數變爲:

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

這個解決方案更加正確,因爲'Hash'使用'StringToStream'和'ToString'本身,正如可以通過Trace [Hash [「abc」,「SHA」],_StringToStream | _ToString,TraceInternal - > True]'。不幸的是它廣泛地使用Java ... – 2011-08-17 09:17:13

2

這是一個可行的kludge。寫入字符串到一個臨時文件,並使用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]&; 

,並在上面的函數返回[email protected]