【发布时间】:2026-01-05 04:15:02
【问题描述】:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]。是java字符串的hash函数,我假设其余语言都类似或者接近这个实现。
如果我们有哈希表和 50 个元素的列表。每个元素是 7 个字符 ABCDEF1、ABCDEF2、ABCDEF3 ..... ABCDEFn
如果哈希表的每个桶包含 5 个字符串(我认为这个函数会使其每个桶一个字符串,但我们假设它是 5 个)。
如果我们调用 col.Contains("ABCDEFn"); // 会做6次比较,7号发现差异。
哈希表大约需要 70 次操作(乘法和加法)来获取哈希码并与存储桶中的 5 个字符串进行比较。然后 BANG 它找到了。
对于列表,大约需要 300 次比较才能找到它。
对于只有 10 个元素的情况,列表大约需要 70 次操作,但 Hashtable 需要大约 50 次操作。并注意哈希表操作更耗时(它是乘法)。
我的结论是,.Net 中的 HybirdDictionary 可能是大多数需要未知大小的 Hashtable 的情况的最佳选择,因为它可以让我使用一个列表,直到列表超过 10 个元素。仍然需要 HashSet 之类的东西,而不是键和值的字典,我想知道为什么没有 HybirdSet!
那你怎么看?
谢谢
【问题讨论】:
标签: c# .net asp.net performance collections