2009-09-17 69 views

回答

10

要獲得散列,請使用System.Security.Cryptography.SHA1Managed class

編輯:像這樣:

byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str)); 

到哈希轉換爲十六進制字符串,使用下面的代碼:如果你想有一個更快的實現

BitConverter.ToString(hashBytes).Replace("-", ""); 

,使用下面的函數:

private static char ToHexDigit(int i) { 
    if (i < 10) 
     return (char)(i + '0'); 
    return (char)(i - 10 + 'A'); 
} 
public static string ToHexString(byte[] bytes) { 
    var chars = new char[bytes.Length * 2 + 2]; 

    chars[0] = '0'; 
    chars[1] = 'x'; 

    for (int i = 0; i < bytes.Length; i++) { 
     chars[2 * i + 2] = ToHexDigit(bytes[i]/16); 
     chars[2 * i + 3] = ToHexDigit(bytes[i] % 16); 
    } 

    return new string(chars); 
} 
1

這是一些sample code這樣做。

+0

爲什麼downvote?順便說一句csharp-online.net有一些很酷的東西.. – russau 2009-09-17 01:47:21

+0

鏈接現在已經死了。 – Yablargo 2016-04-06 21:00:46

1

我還不能評論,沒有足夠的代表,但Lior將Java與C#混合在一個非常錯誤的答案中。

C#中的字節是一個無符號字節,與C#中所有其他整數類型完全相反,它們是默認簽名的。

0xFF部分是完全沒有意義的,因爲即使字節被簽名,0xFE例如是-2。例如,使用按位,並且使用0xFE和0xFF,不會停止負數0xFE作爲結果。 0x7F會。

關於最上面的答案,我很肯定這些微優化可能會有所幫助,儘管它們是微優化,可能不會產生任何實際差異,因爲JIT編譯器可能只是做別的事情,因爲電腦太快了。

chars[2 * i + 2] = ToHexDigit(bytes[i]/16); 
    chars[2 * i + 3] = ToHexDigit(bytes[i] % 16); 

小改變使它使用bitshift和bitwise ops而不是分頻器和模數。

chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF); 
    chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF); 

這是另一個「優化」,雖然我認爲它是一個更可讀的東西。也許這是因爲我深知大部分ASCII表格。

private static char ToHexDigit(int i) 
    { 
     return (char)(i + (i < 10 ? 48 : 55)); 
    } 

如果你想實現小寫十六進制(不ToLower將),只是交換55 87.這使得它很簡單。

更新:它看起來像利奧或有人刪除了他非常關閉的答案。這是一個很好的舉措。

相關問題