[英]Which collection type should I use to store a bunch of hashes?
我有一堆長弦,必須操縱。 它們可以一次又一次地出現,如果它們出現兩次,我想忽略它們。 我認為執行此操作的最佳方法是對字符串進行哈希處理,並以快速的查找時間將哈希列表存儲在某種有序列表中,以便在數據集向我提供新字符串時可以進行比較。
要求:
如果那有什么區別,我不需要倒退(鍵->值)。
關於哪種.NET數據類型最有效的任何建議?
我認為執行此操作的最佳方法是對字符串進行哈希處理,並以快速的查找時間將哈希列表存儲在某種有序列表中,以便在數據集向我提供新字符串時可以進行比較。
不,不要那樣做。 兩個原因:
基本上,您應該只保留HashSet<String>
。 沒問題,可以快速查找,並且您不需要自己實現它。
缺點是您最終會將所有字符串保留在內存中。 如果這是一個問題,那么您將需要制定一種替代策略...實際上可能最終只能將哈希保留在內存中。 確切的詳細信息可能取決於字符串的來源,以及如果得到誤報會導致什么樣的問題。 例如,您可以保留每個字符串的MD5哈希值,作為“比hashCode
哈希值更好”的哈希值-但這仍然允許攻擊者向您提供另一個具有相同哈希值的字符串。 那是問題嗎? 如果是這樣,則更安全的哈希算法(例如SHA-256)可能會有所幫助。 但是,它仍然不能保證您為不同的字符串使用不同的哈希值。
如果您確實想確定,則需要將散列保留在內存中,但將實際的字符串數據保留(存儲到磁盤或數據庫中)-然后,在可能的匹配項中(因為您看到了相同的散列)之前),您需要將存儲的字符串與新字符串進行比較。
如果您將哈希存儲在內存中,則最佳方法將取決於您使用的哈希大小。 例如,對於僅64位哈希,您可以使用Long
per hash並將其保留在HashSet<Long>
。 對於更長的哈希,你需要它可以很容易地被比較的對象等。在這一點上,我建議你看看番石榴和它HashCode
類,在工廠方法一起 (因為番石榴V16不推薦使用)。 HashCodes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.