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

C# 按哈希值对字符串集合进行分组,c#,collections,hash,C#,Collections,Hash,我有一个从1到数千的用户列表。 所有用户都有一个属性列表,我必须对其执行分析。 大多数用户有5到20个不同的属性,但有些用户可能有多达100个 我创建了一个字典,其中Key是用户id,Value是用户的属性 现在,我没有对每个用户进行分析,而是认为我可以根据用户的属性对其进行分组。即如果多个用户具有相同的属性,结果将是相同的 这就引出了我的问题;我可以从字符串集合中生成哈希值吗?您可以从任何内容计算哈希值,包括单个字符串或字符串集合。您可以使用简单的算法,也可以使用复杂的算法。字符串集合的一个简

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

我创建了一个
字典
,其中Key是用户id,Value是用户的属性

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


这就引出了我的问题;我可以从字符串集合中生成哈希值吗?

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

对于您的目的来说,这是一个糟糕的散列,但它说明了计算散列只是确定什么对您来说是重要的,或者什么将足够区分元素

为此,哈希的问题在于,哈希始终是单向计算,从某种意义上说,它简化了被哈希的对象。这意味着信息丢失,可能会发生冲突。也就是说,如果hash(x)==hash(y),这并不意味着x==y,除非hash(x)==x代表每个x

因此,基于散列的分组并不意味着您是基于内容/值进行分组的

也就是说,您可以计算一个散列,其中丢失的比特数更少,例如SHA散列(请参阅)。SHA基于字符串,所以您可以做的是创建集合的JSON/XML序列化,然后在此基础上计算SHA哈希,并基于该SHA哈希进行分组。SHA非常安全,至少可以说,发生碰撞的可能性非常小

因此,我的建议是:将
集合
(或者更确切地说是
列表
)序列化为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类而不是将属性存储在集合中吗?更不用说GetHashCode()的实现依赖于平台!每个用户可以定义的“属性”是一个集合,还是随机的?这太抽象了,至少对我来说是这样。您能用示例数据显示一个简单的类吗?