在阅读维基百科上的pigeonhole principle时,我遇到了 - “哈希表中的冲突是不可避免的,因为可能的密钥数量超过了数组中索引的数量。没有哈希算法,无论多么聪明,可以避免这些碰撞“。但是gperf不是这样做的吗?
请指教。
答案 0 :(得分:5)
gperf
根据预定义字符串列表创建哈希函数和哈希表。
gperf
创造了足够长的哈希,以便有足够的可能性
只有当你事先知道每一个可能的密钥时,你才能做到这一点 - 这是一个假设,它不适用于维基百科条目中的描述,这显然与“非常量”哈希表有关。
答案 1 :(得分:4)
来自gperf的网站:“对于给定的字符串列表,它会产生一个哈希函数和哈希表,......” - 这意味着它必须先知道所有字符串才能准备一个函数,碰撞。
您在通用编程语言中使用的常用哈希函数能够一个接一个地处理任何字符串作为输入(列表不会立即给出),因此它们可能会产生冲突。