hash_set哈希器函数

hash_set hasher function

本文关键字:函数 哈希器 set hash      更新时间:2023-10-16

假设我决定我的哈希器是整数本身,用于hash_set一系列整数。还说我的整数范围非常大,1-20然后是1000-1200,然后是10000-12000。例如: 1, 2, 5, 7, 1111, 1102, 1000, 10003, 10005这不是一个非常糟糕的哈希函数吗?在这种情况下,hash_set将如何存储数据,例如,如果有人知道的话,gcc 实现。

谢谢

编辑:谢谢你们的两位回复。我应该注意,我已经指定了我的哈希器来返回输入值。例如,1001 的哈希值为 1001。所以我问实现是否会自由地进行另一轮哈希,或者它会看到 1001 并且数组大小会增长到 1001?

即使数据聚集在哈希值中的某些范围内,通常也只会使用每个值的哈希值的最低有效位来存储它。这意味着,如果表示 0-128 的位均匀分布,那么无论哈希值的分布如何,您的哈希函数仍将表现良好。这确实意味着,如果您的值都是某个二进制值的倍数,例如八,那么较低的位将不会如此均匀地分布,并且值将聚集在哈希表中,从而导致过度链接和减慢操作速度。

哈希

表将从小开始,偶尔会在负载因子足够高时重新散列以增长。 当然,仅仅因为哈希值是 12000 并不意味着会有 12000 个存储桶——hash_set会做一些类似"mod"哈希函数输出的事情,使其适合桶的数量。

您描述的身份函数对于许多哈希表实现(包括 GCC)来说并不是一个糟糕的哈希函数。 事实上,这是许多人使用的,显然它是有效的。 加密哈希函数是一个不好的例子,但它有不同的目的。