c# - online - md5加密




C#:如何生成短MD5代碼? (5)

MD5始終創建128位哈希。

其他較小的Hashtypes(取自維基百科)

Fowler-Noll-Vo散列函數(32,64,128,256,512或1024位)
Jenkins哈希函數(32位)
MurmurHash(32或64位)
Pearson散列(8位)

但請記住哈希衝突

當我使用MD5加密加密23時,我得到37693cfc748049e45d87b8c7d8b9aacd這個32個字符長的字符串,對於23來說總是靜態的。

我想要相同類型的機制,但應該生成18個或更少(如: 122ff1e4883358b6 )字符長字符串而不是32。

我怎樣才能在C#中做到這一點,c#中有沒有更短版本的MD5?



您可以根據需要獲取盡可能多的MD5哈希值,然後將其餘部分丟棄。 所有位都具有相同的值,因此在執行此操作與使用本機產生較少位的一些散列算法之間沒有區別。

(如果出於安全原因這樣做,請記住,無論算法如何,更少的位都會使哈希更容易破解。即使在安全應用程序之外,更少的位也會增加衝突的風險。另外請記住,MD5相對不安全天 - SHA-1或SHA-2被認為更安全。)


我喜歡@ RichieHindle的回答。 但是,如果您有興趣丟失較少的保真位(從而降低衝突風險),則可以採用MD5哈希返回的128位值,並使用ASCII85 (也稱為Base85編碼)對其進行編碼,基於十六進制的編碼。 這將為您提供20個字節的整個哈希值(這比您想要的更多,但是您可以關閉2個字節,與使用十六進制編碼刪除的32個字節中的14個相比,所產生的損失要小得多)。

編輯: Prashant說20個字符足夠接近,並要求提供示例代碼:

從MD5.ComputeHash調用獲取MD5哈希後,您可以使用Jeff Atwood的ASCII85編碼器

MD5 m = MD5.Create();
byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23"));
Ascii85 encoder = new Ascii85();
encoder.EnforceMarks = false;
string hash85 = encoder.Encode(hash);
Console.Out.WriteLine(hash85);

產量

2ebDPFFZsD?&,r1fX\$,

所以你可以使用hash85encoder.EnforceMarks確保編碼不包含與ASCII85關聯的一些典型前綴和後綴。


這個32個字符的長字符串是十六進制的數字:0-f你可以通過將其十六進制值轉換為36:0-z的基數來縮短它





md5