您可以根據任何內容計算散列值 - 包括單個字符串或字符串集合。你可以使用一個簡單的算法或者一個複雜的算法。一個字符串集合的簡單例子是簡單地計算所有字符串的長度總和,然後MOD通過素數例如32003.
這將是一個糟糕的散列,用於您的目的,但它說明計算散列只是一個決定什麼對你很重要的問題,或者什麼將足以區分元素。
爲此目的散列的問題是散列始終是單向計算,在某種意義上說是對被散列對象的簡化。這意味着信息會丟失並且可能會發生衝突。也就是說,如果hash(x)== hash(y)並不意味着x == y,除非每個x的hash(x)== x。
因此,基於哈希的分組並不意味着您是基於內容/值進行分組。
這就是說,你可以計算一個散列,其中較少的位丟失 - 如SHA散列(請參閱http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)。 SHA基於字符串,因此您可以爲集合創建JSON/XML序列化,然後計算SHA散列,並根據該SHA散列進行分組。 SHA非常安全,碰撞的可能性至少可以說是微乎其微。
因此,我的建議是:序列化Collection
(或相當List
,因爲有List
,項目的順序有保證,而與Collection
它不是),以JSON或XML,計算一個SHA和用它作爲你的分組值。
附錄: 要序列化到JSON,您可以使用內置的擴展在System.Web.Extensions
:
var json = new JavaScriptSerializer().Serialize(myList);
然後計算SHA1哈希值,你可以使用供應商在System.Security.Cryptography
命名空間:
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(json);
string hashAsString = BitConverter.ToString(hash);
是例如異或它們。但是你會碰到碰撞。 'string1.GetHashCode()== string2.GetHashCode()'並不暗示'string1 == string2' –
是否有可能重構代碼以創建UserAttributes類而不是將屬性存儲在Collection? –
AlexH
更不用說GetHashCode()的實現是依賴於平臺的! – Alex