【问题标题】:Hashtable is that fastHashtable 就是这么快
【发布时间】: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


    【解决方案1】:

    这真的很重要吗?您通常关心大量数据对性能的影响。如果收集量很小,额外的 20-30 次操作不会有任何区别。

    【讨论】:

    • 我同意仅在大多数情况下,我在每个 mSec 转换为 30 分钟吞吐量的应用程序上工作。它仍然是一种重要的思维方式,以便更好地理解或回顾你所知道的。
    • @Poma:有时您的数据集很小,但访问量很多。在这种情况下,决定性的不是容器的大小,而是其他一些参数。在这种情况下,即使是小型容器也可能会从大量优化中受益。分析器会告诉你。
    • 如果您非常关心性能并且拥有如此高负载的系统,那么请使用 C 而不是 C#
    【解决方案2】:

    我认为你提出了一个很好的观点。对于小数字,列表可能比哈希表更快,这在文献中有很好的记载。

    但是,您可以轻松创建自己的数据结构,根据其大小count() 将使用列表或哈希。

    【讨论】: