当前位置: 首页 > 知识库问答 >
问题:

mod prime作为C中哈希表的哈希函数是否足够好

马泓
2023-03-14

我需要一个尽可能有效的哈希函数,对于一个使用探测(开放寻址)进行冲突解决的哈希表(实际上是一个哈希集)。表中存储的条目都是4字节的INT,在该范围内具有随机值。

我正在考虑一些比djb2更快的东西,比如

value mod LARGE_PRIME

然后用我的水桶尺寸再修改一次。我想这个素数一定比我的桶大小要大,这意味着我对我的表要增长多大也有某种理智上的限制(它可能永远不会超过256个条目)。

我不需要哈希函数的任何密码学方面--只要它不是极易发生冲突的,它就会很好地工作。

这会成为一个好的哈希函数吗?我可以为我的哈希表容量定义一个特定的算法,每次我调整大小来改进它吗?

共有1个答案

莫英喆
2023-03-14

正确的哈希函数可以归结为您正在哈希的数据:您的值的随机性有多大?如果您的值在该范围内均匀分布,并且该范围比哈希桶的数量大得多,那么只需使用

value MOD number_of_buckets

将是一个合理的哈希函数--添加mod 实际上不会给您带来太多的好处,而且实际上可能会使哈希更糟(因为某些bucket的使用不足或过度超过其他情况)。

素数并不是魔术--它们有时可以用来“抹平”由于公共因素造成的相关效应,但如果你没有那些相关一开始,你可能没有它们会更好--特别是如果速度是至高无上的!

 类似资料:
  • 主要内容:Hashtable 类中的属性,Hashtable 类中的方法在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。 Hashtable 类中的属性 下表中列出了 Hashtable 类中一些常用的属性: 属性 描述 Count 获取哈希表中包含的键值对的个数 IsFixedSize 获取一个值,用来表示哈希

  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 我正在使用Google Maps API,觉得除了大量的语句之外,还有一种更好的方法来搜索全景图像。我认为使用外部哈希表会更有效,更容易维护。每个图像都有一个唯一的,我可以定义它。阅读哈希表,我相信我的说法是正确的,我可以做一个表和完善的函数,以获得我需要的数据,在恒定的时间。有没有一个很好的资源如何构建这个?我对哈希一点经验都没有。 我的逻辑是这样的:每个图像都以的形式保存在一个目录中,其中是一

  • REDIS_HASH (哈希表)是 HSET 、 HLEN 等命令的操作对象, 它使用 REDIS_ENCODING_ZIPLIST 和 REDIS_ENCODING_HT 两种编码方式: 字典编码的哈希表 当哈希表使用字典编码时, 程序将哈希表的键(key)保存为字典的键, 将哈希表的值(value)保存为字典的值。 哈希表所使用的字典的键和值都是字符串对象。 下图展示了一个包含三个键值对的哈希

  • Hashtbl 模块 Hashtbl模块实现了一个高效的,可变的查询表。如下创建一个哈希表: # let my_hash = Hashtbl.create 123456;; val my_hash : ('_weak1, '_weak2) Hashtbl.t = <abstr> 这个123456是哈希表的初始大小。这个值可以是你对数据量的一种猜测,但是哈希表有可能会 随着数据量的增多而变大,因此

  • 哈希表 通过最简单的取模运算作为哈希算法 class HashNode(object): def __init__(self, id, data): self.id = id self.data = data self.next = None def __str__(self): return '(%d,%s)' %