2011-11-17 118 views
0

我知道可以在c#容易地使用MD5,我使用的代碼是下面:MD5與全字符集,使字符串更短,但如何?

using System.Security.Cryptography; 
public static string MD5(string input) 
{ 
    MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
    byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
    bs = x.ComputeHash(bs); 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    foreach (byte b in bs) 
    { 
     s.Append(b.ToString("x2").ToLower()); 
    } 
    return s.ToString(); 
} 

通常,MD5字符串是32個字符長,0-9和A-F。 我想知道,如果我使用0-9 A-Z a-z和_。 - 等,這將使約64個字符集,並且MD5字符串將顯着縮短。我將使用MD5字符串來標識並保存在數據庫中。較短的字符串可以做同樣的事情並佔用較少的空間,可以減少索引時間。

所以在這裏,我的問題,是有人在這裏有一個快速的方法來0-9A-F字符串更改爲0-9A-ZA-z._串

附:我有一個基本的想法是將MD5字符串更改爲一個int(將會非常大),然後轉換爲任何字符集的字符串。我能成像它會慢。

任何想法都有幫助。謝謝。

[編輯]

謝謝大家,我最終推出一個我自己的,我 需要一個字符串,因爲我需要它作爲URL的一部分。 因爲我不使用Base64,因爲我想要一個固定長度的字符串。

MD5是16個字符和長度爲32,當我將其更改爲64個字符,長度成爲20

這裏是更新功能我使用。

public static string MD520(string input) 
{ 
    char[] chars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '-', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 
    MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
    byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
    bs = x.ComputeHash(bs); 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    byte m = 0; 
    int c = 0; 
    foreach (byte b in bs) 
    { 
     if (m == 2) 
     { 
      c = c * b; 
      for (byte i = 0; i < 4; i++) 
      { 
       int n = c % 64; 
       s.Append(chars[n]); 
       c = (c - n)/64; 
      } 
      m = 0; 
     } 
     else 
     { 
      c = ((m > 0) ? c : 1) * b; 
      m++; 
     } 
    } 
    return s.ToString(); 
} 

回答

0

而不是

System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    foreach (byte b in bs) 
    { 
     s.Append(b.ToString("x2").ToLower()); 
    } 
    return s.ToString(); 

你可以使用

return Convert.ToBase64String(bs); 

這將導致更短的字符串,但並不使用完整的字符集。你必須爲此創建自己的自定義編碼,儘管我不會懷疑已經存在的人。

1

如果要將其保存在儘可能最小的空間內,請保存字節;不要將它轉換爲字符串,因爲你的代碼正在做。它 32字節的數據。期。通過將其顯示爲一個字符串,您可以對其進行2至4次或更多的漫遊。

不要試圖推出一些自定義計劃......只是不要在第一個地方氣球。

(也,MD5被認爲是弱了,你知道吧?)

+0

我必須使用一個字符串,因爲它是URL的一部分。 MD5是弱的,但我只是用它檢查相同的標籤,甚至碰撞,無所​​謂:) –

0

如果你並不真的需要它是可讀的字符串,只要使用二進制領域。否則,使用Base64將是最方便的。

+0

這個答案很可能會導致提問者以一個even * longer *字符串結束,因爲他可能會Base64字符串,而不是字節。應該澄清,imo。 –