Math 没有完美的散列函数吗?

Math 没有完美的散列函数吗?,math,hash,perfect-hash,Math,Hash,Perfect Hash,根据:“首先,它是一个已知的事实,没有完美的哈希算法,其中没有冲突。” 作者所说的是实际的,而不是理论上的,对吗?因为理论上,这里有一个完美的散列函数:“对于给定的对象,给它分配一个新的数字”。有无限多的数字,所以我们总是有一些东西可以分配给唯一的对象。但实际上这是不可行的,因为我们的内存有限。通常,哈希函数从一组对象(宇宙)映射到一组较小的对象(密码域)。通常,宇宙是一个无限集,如所有字符串的集合或所有数字的集合,而密码域是一个有限集,如所有512位字符串的集合,或0到某个数字k之间的所有数字

根据:“首先,它是一个已知的事实,没有完美的哈希算法,其中没有冲突。”


作者所说的是实际的,而不是理论上的,对吗?因为理论上,这里有一个完美的散列函数:“对于给定的对象,给它分配一个新的数字”。有无限多的数字,所以我们总是有一些东西可以分配给唯一的对象。但实际上这是不可行的,因为我们的内存有限。

通常,哈希函数从一组对象(宇宙)映射到一组较小的对象(密码域)。通常,宇宙是一个无限集,如所有字符串的集合或所有数字的集合,而密码域是一个有限集,如所有512位字符串的集合,或0到某个数字k之间的所有数字的集合,等等,对象上的
hashCode
函数有一个可由
int
表示的值的密码域,该值都是32位整数

我相信,当作者说“没有完美的哈希函数”时,他们所说的是,不可能在不发生至少一次冲突的情况下,将所有字符串的无限集合映射到所有32位整数的集合中。事实上,如果你选择232+1个不同的字符串,你保证至少有一次冲突

你的论点-我们不能给每个对象分配一个不同的散列码吗隐式假设哈希函数的余域是无限的。例如,如果要尝试此方法为字符串构建哈希函数,则哈希函数的密码域必须至少与所有可能的自然数集一样大,因为有无限多个字符串。大多数编程语言不支持以这种方式工作的散列代码,尽管理论上这是正确的。当然,有人可能会反对,并说这不算作有效的哈希函数,因为哈希函数通常有有限的密码域


希望这有帮助

您的“完美”函数如何确定“新数字”是什么?除了在Java(似乎是您的语言)中,哈希是一个整数,只能取2^32个值。kenneth,这在计算机上是不可能的,原因我已经解释过了,但理论上它将是以前的hashcode/number+1@user1040923: 对于给定对象,为其指定一个新编号不是散列函数,因为它不是函数,因为如果我给它两次相同的对象,它会返回不同的数字。给定相同的输入,函数必须返回相同的值。要执行此操作,建议的函数必须将输入识别为等于前一个输入,并提供前一个输入的数字。执行此操作需要rem分解和查找以前的输入。即使你实现了这一点,它也会使散列函数依赖于输入的显示顺序,这打破了散列的一些应用程序。@EricPostPhill-我认为OP讨论的是一个理论函数,在这个函数中,你预先排列所有可能的输入,然后给每个输入分配n序列中的ext数。如果输入域是有限的,那么这实际上是一个有效的哈希函数。