我有一个用户列表,范围从1到数千。 所有用户都有一个我必须执行分析的属性列表。 大多数用户拥有5到20个不同的属性,但有些可能有多达100个。
我创建了一个Dictionary<string, Collection<string>>
,其中Key是UserId,Value是用户的属性。
现在我没有对每个用户进行分析,而是认为我可以按用户的属性对用户进行分组。即如果多个用户具有相同的属性,结果将是相同的。
这引出了我的问题;我可以以某种方式从字符串Collection生成哈希值吗?
答案 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}}