簡體   English   中英

我應該使用哪種收集類型來存儲一堆哈希值?

[英]Which collection type should I use to store a bunch of hashes?

我有一堆長弦,必須操縱。 它們可以一次又一次地出現,如果它們出現兩次,我想忽略它們。 我認為執行此操作的最佳方法是對字符串進行哈希處理,並以快速的查找時間將哈希列表存儲在某種有序列表中,以便在數據集向我提供新字符串時可以進行比較。

要求:

  • 能夠將項目(哈希)添加到我的收藏中
  • 能夠(快速)檢查集合中是否已存在特定的哈希。
  • 不太占用內存。 我最終可能會得到大約100,000個哈希值。

如果那有什么區別,我不需要倒退(鍵->值)。

關於哪種.NET數據類型最有效的任何建議?

我認為執行此操作的最佳方法是對字符串進行哈希處理,並以快速的查找時間將哈希列表存儲在某種有序列表中,以便在數據集向我提供新字符串時可以進行比較。

不,不要那樣做。 兩個原因:

  • 哈希值僅告訴您兩個值是否相同; 他們不告訴你,如果它們相同的。
  • 您會做很多已經為您完成的工作。

基本上,您應該只保留HashSet<String> 沒問題,可以快速查找,並且您不需要自己實現它。

缺點是您最終會將所有字符串保留在內存中。 如果這是一個問題,那么您將需要制定一種替代策略...實際上可能最終只能將哈希保留在內存中。 確切的詳細信息可能取決於字符串的來源,以及如果得到誤報會導致什么樣的問題。 例如,您可以保留每個字符串的MD5哈希值,作為“比hashCode哈希值更好”的哈希值-但這仍然允許攻擊者向您提供另一個具有相同哈希值的字符串。 那是問題嗎? 如果是這樣,則更安全的哈希算法(例如SHA-256)可能會有所幫助。 但是,它仍然不能保證您為不同的字符串使用不同的哈希值。

如果您確實想確定,則需要將散列保留在內存中,但將實際的字符串數據保留(存儲到磁盤或數據庫中)-然后,在可能的匹配項中(因為您看到了相同的散列)之前),您需要將存儲的字符串與新字符串進行比較。

如果您將哈希存儲在內存中,則最佳方法將取決於您使用的哈希大小。 例如,對於僅64位哈希,您可以使用Long per hash並將其保留在HashSet<Long> 對於更長的哈希,你需要它可以很容易地被比較的對象等。在這一點上,我建議你看看番石榴和它HashCode類,在工廠方法一起HashCodes (因為番石榴V16不推薦使用)。

使用一套。

ISet<T>接口由例如HashSet<T>

除非您的哈希函數確實很差,否則AddContains是O(1),最糟糕的情況是O(n)。

暫無
暫無

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

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