按其哈希值对字符串集合进行分组

时间:2014-01-31 09:03:26

标签: c# collections hash

我有一个用户列表,范围从1到数千。 所有用户都有一个我必须执行分析的属性列表。 大多数用户拥有5到20个不同的属性,但有些可能有多达100个。

我创建了一个Dictionary<string, Collection<string>>,其中Key是UserId,Value是用户的属性。

现在我没有对每个用户进行分析,而是认为我可以按用户的属性对用户进行分组。即如果多个用户具有相同的属性,结果将是相同的。

这引出了我的问题;我可以以某种方式从字符串Collection生成哈希值吗?

1 个答案:

答案 0 :(得分:0)

您可以从任何内容计算哈希值 - 包括单个字符串或字符串集合。您可以使用简单的算法或复杂的算法。字符串集合的一个简单示例是简单地计算所有字符串的长度之和,然后使用素数(例如32003)计算MOD。

对于您的目的而言,这将是一个糟糕的哈希值,但它说明计算哈希值只是确定对您来说重要的内容,或者足以区分元素的内容。

为此目的散列的问题是散列总是单向计算,在某种意义上是对被散列对象的简化。这意味着信息丢失并且可能存在冲突。也就是说,如果hash(x)== hash(y)并不意味着x == y,除非hash(x)== x为每个x。

因此,基于哈希的分组并不意味着您正在基于内容/值进行分组。

话虽这么说,你可以计算一个哈希,其中更少的位丢失 - 例如SHA哈希(参见http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)。 SHA基于字符串,因此您可以创建集合的JSON / XML序列化,然后在其上计算SHA哈希,并根据该SHA哈希进行分组。 SHA是非常安全的,至少可以说碰撞的可能性很小。

因此,我的建议是:序列化Collection(或更确切地说是List,因为使用List时,项目的顺序是有保证的,而Collection则是System.Web.Extensions不是JSON或XML,计算它的SHA,并将其用作分组值。

附录: 要序列化为JSON,您可以使用var json = new JavaScriptSerializer().Serialize(myList); 中的内置扩展名:

System.Security.Cryptography

然后,要计算SHA1哈希值,可以使用SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); byte[] hash = sha1.ComputeHash(json); string hashAsString = BitConverter.ToString(hash); 命名空间中的提供程序:

{{1}}