簡體   English   中英

如何使用項目的哈希檢查HashSet是否包含項目?

[英]How can I check if a HashSet contains an item using the hash of the item?

我想檢查HashSet是否包含特定元素。 我已經有了元素的int哈希碼,但沒有對元素本身的引用。

是否可以在不迭代整個集合的情況下執行此操作?

沒有為什么

  • 哈希碼與對象沒有一對一的映射( 鴿子原理
  • .Net HashSet / Dictionary不公開此實現細節

如果你真的需要通過哈希碼找到對象,你可以

  • 迭代所有項目並比較哈希碼
  • 如果這是主要功能 - 考慮是否自定義比較器將允許您具有將匹配具有相同哈希碼的任何其他對象的特殊對象將工作...

特殊比較器的近似代碼

 class ObjectsToStore
 {
     ....
     public int? HashCodeOverwrite; 
 }

 class ComparerByHashCode : IEqualityComparer<ObjectsToStore>
 {

   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<ObjectsToStore>(new ComparerByHashCode());
var itemByHashCode = myHashSet[new ObjectsToStore{HasCodeOverwrite= 1234}];

編號哈希函數是單向函數。 它將實例從(可能無限大的)空間映射到有限的大空間。 它加快了過程,但不保證唯一性。

日常生活中非常簡單的哈希函數可以是:存儲員工記錄,秘書使用26個文件夾,名為“A”到“Z”。 朱麗葉的唱片存放在'J'文件夾中,邁克在'M'中的記錄,查理在'C'中的記錄。 現在我給你這26個文件夾,你想知道公司里是否有人叫奧斯卡。 除非“O”文件夾為空,否則您必須檢查該文件夾中的每條記錄以告知答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM