我最近一直在为 C 中的一个项目制作自定义哈希映射。
我的哈希图目前是这样工作的:
密钥通过Fowler–Noll–Vo 1a 散列函数进行散列以最小化冲突
如果项目数超过桶数,则发出重新哈希,其中桶数加倍
每个存储桶都包含一个必须在堆上分配的项目数组。这意味着每次创建哈希映射时,都会
1 + numberOfBuckets
完成堆分配。
我目前对这个哈希映射的一个问题是,创建它对于我的用例来说太慢了(我必须创建很多,在数百万的范围内)。
提高创建速度的一个简单解决方案是仅在需要时分配存储桶,但这实际上只会延迟分配,并且性能增益将是最小的。
还想到的一个想法是每个桶只有一个固定大小的项目数组。这样,如果操作正确,我只需要为每个映射分配一个大堆。但是,存储桶数组存在不可解决溢出的轻微风险,尤其是在较小的大小时。我计算过,从 32 个桶和 18 个项目的固定容量开始,这个概率大约是 10^(-19)(如果我的数学是正确的),并且桶越多它会变得更小。因此,发生该错误的可能性基本上可以忽略不计。
特别是本着面向数据设计的精神,我发现哈希映射的这个概念非常有趣,但我找不到任何关于忽略可忽略的错误风险是否是一种可以、现在或什至应该使用的编程实践一点也不。我真的很想知道这是否是任何地方的已知做法,以及是否可以在哈希映射之外的其他地方找到它。