2013-05-15 110 views
2

最近,我注意到SHA算法計算隨機長度的散列。SHA計算隨機長度的散列

HashAlgorithm provider; 
provider = HashAlgorithm.Create("System.Security.Cryptography.SHA256"); 

while(!stackoverflow) { 
    Console.WriteLine(Encoding.UTF8.GetString(
     provider.ComputeHash(Encoding.UTF8.GetBytes(
       (new Random()).Next().ToString()))) 
     .Count().ToString()); 
} 

輸出:

29 
29 
30 
29 
29 
30 
29 
31 
29 
29 
32 
29 
30 
28 
... 

是否可以設置最大散列長度是多少? (可以使哈希無用..)或者我在計算哈希時做錯了什麼?編碼?

編輯:

上面的代碼段僅僅是一個例子。我最終需要的是一種方法,它接受一個字符串,計算字符串的散列並返回它。 HashAlgorithm.ComputeHash需要字節並返回字節,所以我使用UTF8.GetBytes()/UTF8.GetString()進行轉換,這似乎是一個巨大的錯誤。

回答

5

SHA1-256散列總是32字節長。你在這裏做的是你試圖將這些字節解釋爲UTF-8編碼的文本,這顯然是錯誤的,因爲絕對不能保證散列字節是有效的UTF8編碼序列。

即使有這樣的保證,UTF-8是一種可變長度編碼:當將原始字節轉換爲Unicode字符時,每個字符「用盡」可變數量的字節(1到4),以便從這個代碼在理論上可以在8和32之間的任何地方。

一般來說,這個例子沒有意義。請澄清你的意圖是什麼。

+0

所以不同的編碼可以解決這個問題? ASCII? Unicode的?我剛剛看到使用ASCII,輸出總是32個字符。隨着Unicode,它是16. – Atrotygma

+0

問題是:*你想要做什麼?* – Jon

+0

我的意圖是生成一個隨機和唯一的哈希用作標識符。在我的「真實」應用程序中,其他部分會散列以​​保證獨特和隨機性。上面的代碼只是一個例子。我想要的是具有固定長度的十六進制字符的散列。但是這也是一個普遍的「編碼/加密」問題,因爲我還使用UTF8.GetString/UTF8.GetBytes和RSA密鑰生成。 – Atrotygma