2014-04-02 35 views
1

引用的代碼是從this answer,但類似的代碼幾乎無處不在。假設我們需要使用接受byte[]System.Security.Cryptography.HashAlgorithm.ComputeHash()方法的實現來散列C#字符串內容。典型的代碼如下所示:爲什麼散列字符串的樣本通常使用Encoding.UTF8?

public static byte[] GetHash(string inputString) 
{ 
    HashAlgorithm algorithm = MD5.Create(); // SHA1.Create() 
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); 
} 

字符串在內部以Unicode存儲。

爲什麼使用Encoding.UTF8代替Encoding.Unicode

+1

對不起,但我不明白這個問題的客觀答案是如何存在的。 – Jon

+0

@Jon:「真的沒有意義」或「如果您使用'Encoding.Unicode'這些和這些不好的事情發生」。 – sharptooth

+0

以上都不是。這是一個任意的選擇。實際選擇很重要的唯一方式是計算這些散列的* all *代碼必須使用相同的編碼,否則它們顯然會將相同的輸入散列到不同的值。 – Jon

回答

3

爲什麼使用Encoding.UTF8代替Encoding.Unicode?

因爲這是大多數其他應用程序框架已作出選擇用於散列的編碼。在.NET世界之外,UTF-16LE編碼(這是錯誤的「Unicode」編碼實際上是)不一定是字符串存儲的自然選擇。如果您使用的不是UTF-8,您將無法與其他系統生成的散列進行互操作。重要的是,UTF-8是ASCII兼容的:對於只有ASCII的輸入數據,這將產生匹配的哈希到所有的軟件,與無編碼的字節串一起工作。這包括很多PHP webapps,稱爲天真String.getBytes等的Java應用程序。

因此,使用UTF-8意味着您可以與使用UTF-8和部分互操作的所有現代應用程序完全互操作。使用UTF-16會給你不符合任何其他人的散列。

如果您確定只會在內部使用哈希值,您仍然可以這樣做,但它並不能真正贏得任何東西。從非編碼到UTF-8的任何節省可能會因爲需要散列較長的輸入序列而被否定,因爲對於最可能發生的ASCII字符,UTF-8比UTF-16更有效。

相關問題