C++ 散列集散列函数

C++ 散列集散列函数,c++,stl,C++,Stl,假设我决定一系列整数的hash_集的hasher就是整数本身。也就是说我的整数范围非常大,1-20,然后是1000-1200,然后是10000-12000。 e、 g:1,2,5,7111111021000100031005 这不是一个非常糟糕的散列函数吗?在这种情况下,如果有人知道,数据是如何通过hash_集存储的,比如gcc实现 谢谢 编辑: 谢谢你的两个答复。我应该注意,我已经指定了我的哈希器来返回输入值。e、 g.1001的哈希值为1001。因此,我问这个实现是否会自由地进行另一轮哈希,

假设我决定一系列整数的hash_集的hasher就是整数本身。也就是说我的整数范围非常大,1-20,然后是1000-1200,然后是10000-12000。 e、 g:1,2,5,7111111021000100031005 这不是一个非常糟糕的散列函数吗?在这种情况下,如果有人知道,数据是如何通过hash_集存储的,比如gcc实现

谢谢 编辑:
谢谢你的两个答复。我应该注意,我已经指定了我的哈希器来返回输入值。e、 g.1001的哈希值为1001。因此,我问这个实现是否会自由地进行另一轮哈希,或者它会看到1001,数组大小会增长到1001?

哈希表会开始变小,偶尔会在负载因子足够高时重新哈希以增长。仅仅因为散列值为12000并不意味着将有12000个存储桶,当然散列集合将执行类似于修改散列函数输出的操作,以使其适合存储桶的数量


对于包括GCC在内的许多哈希表实现,您描述的标识函数不是一个糟糕的哈希函数。事实上,它是许多人使用的,而且显然是有效的。一个不好的例子是加密哈希函数,但它有不同的用途。

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

我同意,标识函数可以相当有效,但这取决于要求,我的应用程序也需要节省空间,所以我想知道哈希程序是否会进行另一轮哈希,或者是否会创建1200个bucket。正如我所说,它会修改哈希函数的输出,使其适合bucket数的范围。很难说这是另一轮哈希,这就是哈希表的工作原理。感谢您的回复和输入。我认为你假设这就是它发生的方式,我觉得这很合理,或者这是gcc或任何其他实现的方式吗?我没有假设,我已经看过gcc的哈希表实现,从版本4.2-4.4左右。很好。谢谢在这种情况下,你能详细说明模是如何应用的吗。既然你说的是模运算,我猜它不完全是模运算,它是如何决定模运算使用哪个数的?gcc实现就是这样做的,还是你说的是一般的散列函数?我说的是一般的散列函数。但这与函数关系不大,更多的是将实际散列值拟合到存储桶中,存储桶可能小于整数可表示的最大值,因此所有实现都会以某种方式执行此步骤。您是说将数组大小增加到1001不是散列,或者做另一轮的散列就不是散列了?我不明白你的意思:。尽管我无论如何都不同意我可能只是误解了最初的问题。