要澄清:它将是一些函数,它会产生可变长度的输出,而不会为不同的输入产生相同的输出。从输出中得出输入在计算上也很困难。
#1 楼
假设的哈希函数需要具有至少等于输入长度的输出长度才能满足您的条件,因此它不是哈希函数。请参阅Pigeonhole原理。记住n位哈希函数是从$ \ {0,1 \} ^ ∗ $到$ \ {0,1 \} ^ n $的函数,没有这样的函数功能可以满足您的两个条件。本质上,如果它的长度为$ n $位,那么它只能保证最多$ n $位的输入的唯一性,即使那样,它也不是一个好的PRF,因为它将是一个排列-这不是哈希函数-因此,您希望输出大小比输入大小长,而输入大小现在实际上离哈希函数的定义还很远。
现在,如果您愿意称呼它除了散列函数以外,是的,有可能构造这样的基元,假设必须以某种方式计算输出长度,如果对于$ n $位输出有$ m $个可能的输入,则$ m \ leq 2 ^ n $。很明显的一种是分组密码,它满足您的条件,但它具有所有输出都有对应输入(可能不是您想要的输入)的附加属性。
如您所见,如果您不需要排列,基本上剩下的功能是伪随机地“扩展”输入,以便所有输入都具有输出,但并非所有输出都具有输入。例如,如果$ | X |,CodesInChaos的$ y = g ^ x \ mod {p} $的示例是无冲突的。 \ leq p $其中$ X $是函数的输入集合,对于足够大的素数$ p $是单向的(实际上,它需要具有大阶数的子组,通常$ p = 2q + 1 $是大质数$ q $的常见选择),因为您需要解决离散对数问题以将其取反。
评论
$ \ begingroup $
我知道输出需要比输入更长,我在想一个函数,该函数可以用来证明拥有它们将在以后发布的数据,以证明他们至少拥有数据那么远。
$ \ endgroup $
– Benj
2013年6月19日5:31
$ \ begingroup $
@ improv32哈希函数可以在所谓的承诺方案中做到这一点。为什么需要“无冲突”属性?还是您真正的意思是,“发生碰撞的可能性极低,这就是加密哈希函数的用途,因为当存在无限多的碰撞时,很难偶然或故意找到一个碰撞”?
$ \ endgroup $
–托马斯
2013年6月19日下午5:33
$ \ begingroup $
我只是想知道是否有一个函数的发生碰撞的机会微不足道,但却证明没有发生碰撞。
$ \ endgroup $
– Benj
2013年6月19日下午5:58
$ \ begingroup $
@ improv32我了解。不,根据“哈希函数”的标准定义,没有。但是肯定有单向,无冲突的功能,如CodesInChaos在评论中提到的那样。
$ \ endgroup $
–托马斯
13年6月19日在6:04
$ \ begingroup $
@ improv32:只需使用您喜欢的任何加密方案,并且密钥要比数据短得多。 (如果需要,您可以轻松删除此要求。)为了稍后证明您早先拥有数据,请释放用于加密数据的密钥。
$ \ endgroup $
– David Schwartz
2013年6月21日9:27
#2 楼
是的,它们在Wiki上被称为Perfect hash函数,也看到它们被称为无冲突哈希函数。如果您点击页面底部的链接,则会有文章和源代码的链接。评论
$ \ begingroup $
完美的哈希函数不是加密哈希函数,因为它们的域是有限的。
$ \ endgroup $
–托马斯
2015年1月5日在15:01
$ \ begingroup $
@Thomas什么是“有限域”?
$ \ endgroup $
– Cregox
15年9月18日在18:23
$ \ begingroup $
有限域意味着可能的输出数量是有限的。即有一个整数N,因此该函数最多具有N个不同的可能输出。这是互斥的,没有冲突,因为您总是可以生成N + 1个不同的输入(例如,包含数字1、2、3,... N + 1的文本文件),并且因为只有N个可能的输出,它们之间至少会发生一次碰撞。
$ \ endgroup $
–RocketNuts
19-2-4在23:35
$ \ begingroup $
实际上,正确的术语应该是共域而不是域。域是函数的输入空间,而域是函数的输出空间。
$ \ endgroup $
–RocketNuts
19年2月4日在23:39
评论
有免碰撞单向功能。例如$ y = g ^ x \ mod p $。但是我很确定,尽管发生了冲突,SHA-512还是一个更好的选择。@CodesInChaos这个碰撞如何解决?如果我们考虑所有可能的loglog(p)bits + 1位输入,那么根据定义,它们之间至少会有一个冲突?