如何使用项目的哈希检查HashSet是否包含项目?

我想检查HashSet是否包含特定元素。 我已经有了元素的int哈希码,但没有对元素本身的引用。

是否可以在不迭代整个集合的情况下执行此操作?

没有为什么

  • 哈希码与对象没有一对一的映射( 鸽子原理 )
  • .Net HashSet / Dictionary不公开此实现细节

如果你真的需要通过哈希码找到对象,你可以

  • 迭代所有项目并比较哈希码
  • 如果这是主要function – 考虑是否自定义比较器将允许您具有将匹配具有相同哈希码的任何其他对象的特殊对象将工作…

特殊比较器的近似代码

  class ObjectsToStore { .... public int? HashCodeOverwrite; } class ComparerByHashCode : IEqualityComparer { public bool Equals(ObjectsToStore b1, ObjectsToStore b2) { if (b1.HashCodeOverwrite.HasValue || b2.HashCodeOverwrite.HasValue) { return b1.GetHashCode() == b2.GetHashCode()); } // add all null checks here too. return b1.Equals(b2); } public int GetHashCode(ObjectsToStore b) { return b.HashCodeOverwrite.HasValue? b.HashCodeOverwrite.Value:b.GetHashCode(); } } 

近似用法:

 var myHashSet = new HashSet(new ComparerByHashCode()); var itemByHashCode = myHashSet[new ObjectsToStore{HasCodeOverwrite= 1234}]; 

否。哈希函数是单向函数。 它将实例从(可能无限大)空间映射到有限的大空间。 它加快了过程,但不保证唯一性。

日常生活中非常简单的哈希函数可以是:存储员工记录,秘书使用26个文件夹,名为“A”到“Z”。 朱丽叶的唱片存放在’J’文件夹中,迈克在’M’中的记录,查理在’C’中的记录。 现在我给你这26个文件夹,你想知道公司里是否有人叫奥斯卡。 除非“O”文件夹为空,否则您必须检查该文件夹中的每条记录以告知答案。