c -存储大随机数的最佳哈希函数是什么?



我想在数据结构中存储大量的数字,为此,我想使用哈希函数,以便插入,删除或搜索可以快速。但是我无法决定我应该使用哪个哈希函数?

一般来说,我想知道如何确定一个哈希函数对任何特定问题都是好的?

编辑:我认为这让人们混淆了使用术语"随机"。这里的随机,我的意思是,我没有任何特定的数字范围,我必须从中选择[任何32位整数],但我有一个总数,它将被存储在数据结构中,比如5000个数字。那么,在这种情况下,建议我最好的哈希函数,为什么你认为它是最好的?

如果数字是均匀随机的,只需使用选择低位的哈希函数。

unsigned hash_number(long long x)
{
    return (unsigned) x;
}

即使您的输入数字是完全随机的,使用h(x) = x仍然可能造成性能问题。想象一下,你的数字是从0、2、4、…, 2k,虽然是随机的,但它们都不会映射到哈希表的第一个桶(桶0),假设两个桶大小的幂。因此,真正重要的是输入数字的信息熵。

在您的情况下,一个很好的选择是Thomas Wang的整数哈希函数,它是可逆的,并保持了良好的雪崩效果(http://en.wikipedia.org/wiki/Avalanche_effect)。有一篇文章描述了Thomas Wang的哈希函数及其逆:http://naml.us/blog/2012/03.

我不明白你的问题。使用散列算法来存储一些随机数是多余的。如果问题还有其他问题,数据结构的选择将取决于这个问题是什么(你没有说)。

如果这些数字真的是随机的或伪随机的,那么你所需要的就是一个堆栈或循环缓冲区——在数据结构中添加(push)一个新的随机数的能力,以及从结构中删除(pop)一个现有随机数的能力。如果您希望按顺序检索它们,请使用循环缓冲区。在保存随机数列表时,散列函数在各个方面都比简单的堆栈(或循环缓冲区)更糟糕——它更复杂,运行速度更慢,并且使用更多内存。

大多数语言/环境提供哈希函数,可以使用(或作为)"字典"课程,这些课程都有关于效率的指导。通常,您可以通过分配更多内存来使字典类更快——当散列键发生冲突时,它们会变慢。因此,实际数字在所有可能数字中的"密度"很重要。

因此,如果你必须保存100个这样的数字,你可以使用只查看最后12位的哈希函数。这给出了2^12 = 4096个可能的哈希值,所以碰撞只会发生100/2048次,少于5%。另一方面,你使用的内存是你应该使用的20多倍。(此函数与取数的模以2^12为底相同,与Epp建议的类似。)

编写一个基于哈希函数的存储类,它可以正确地处理哈希冲突(因为它必须),优雅地处理重复的数据,如果你丢弃了坏数据(比如每个数字都一样),它不会崩溃,而且效率很高,这不是一项微不足道的任务。

另一方面,实现堆栈或循环缓冲区非常简单,非常有效,并且具有完全可预测的行为。

你确定你没有把它弄得比需要的更复杂吗?

最新更新