2014-01-31 32 views
0

我有一個用戶列表,範圍從1到幾千。 所有用戶都有我必須在其上執行分析的屬性列表。 大多數用戶有5到20個不同的屬性,但有些可能有多達100個。按其散列值對字符串集合進行分組

我創建了一個Dictionary<string, Collection<string>>其中Key是UserId,Value是用戶的屬性。

現在不是對每個用戶進行分析,而是認爲我可以按用戶的屬性對用戶進行分組。也就是說,如果多個用戶具有相同的屬性,結果將是相同的。

這導致我對我的問題;我可以以某種方式生成一個字符串集合的哈希值?

+0

是例如異或它們。但是你會碰到碰撞。 'string1.GetHashCode()== string2.GetHashCode()'並不暗示'string1 == string2' –

+1

是否有可能重構代碼以創建UserAttributes類而不是將屬性存儲在Collection ? – AlexH

+0

更不用說GetHashCode()的實現是依賴於平臺的! – Alex

回答

0

您可以根據任何內容計算散列值 - 包括單個字符串或字符串集合。你可以使用一個簡單的算法或者一個複雜的算法。一個字符串集合的簡單例子是簡單地計算所有字符串的長度總和,然後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); 
相關問題