Hash 散列函数如何将无限量的数据编码为有限量?

Hash 散列函数如何将无限量的数据编码为有限量?,hash,information-theory,Hash,Information Theory,哈希函数总是创建具有固定长度的输出,即使输入可以无限大 那么,这里怎么可能没有信息丢失呢?那么,一些输入不应该产生相同的输出吗?是的。两个输入可能导致相同的输出,从而导致哈希冲突 散列的设计使得对文本进行散列非常容易,但逆转这一过程很困难。散列的目的不是存储信息。相反,哈希通常用于安全性(以及数据结构) 例如,网站将散列用户的密码,并存储散列而不是物理密码。这样,如果网站的安全性被破坏,攻击者只能获得哈希值,而哈希值仍然不允许攻击者登录,因为对密码进行反向工程非常困难 散列集是散列的另一个应用程

哈希函数总是创建具有固定长度的输出,即使输入可以无限大


那么,这里怎么可能没有信息丢失呢?那么,一些输入不应该产生相同的输出吗?

是的。两个输入可能导致相同的输出,从而导致哈希冲突

散列的设计使得对文本进行散列非常容易,但逆转这一过程很困难。散列的目的不是存储信息。相反,哈希通常用于安全性(以及数据结构)

例如,网站将散列用户的密码,并存储散列而不是物理密码。这样,如果网站的安全性被破坏,攻击者只能获得哈希值,而哈希值仍然不允许攻击者登录,因为对密码进行反向工程非常困难


散列集是散列的另一个应用程序。通过对对象进行散列并仅存储散列,可以在固定时间内检查对象是否存在于集合中。您只需搜索哈希集中与正在检查的对象具有相同哈希的所有对象。随着哈希集大小的增加,哈希冲突的可能性也随之增加。

是。两个输入可能导致相同的输出,从而导致哈希冲突

散列的设计使得对文本进行散列非常容易,但逆转这一过程很困难。散列的目的不是存储信息。相反,哈希通常用于安全性(以及数据结构)

例如,网站将散列用户的密码,并存储散列而不是物理密码。这样,如果网站的安全性被破坏,攻击者只能获得哈希值,而哈希值仍然不允许攻击者登录,因为对密码进行反向工程非常困难

散列集是散列的另一个应用程序。通过对对象进行散列并仅存储散列,可以在固定时间内检查对象是否存在于集合中。您只需搜索哈希集中与正在检查的对象具有相同哈希的所有对象。随着哈希集大小的增加,哈希冲突的可能性也随之增加

那么,这里怎么可能没有信息丢失呢

这是不可能的,很多信息都丢失了

在完美散列的情况下,没有冲突,我们甚至可以说信息并没有真正丢失(它只是不包含在系统中),因为我们知道所有可能的输入,并且知道在生成的散列中没有冲突,但它们可以作为索引使用,使用的方式不可能或与输入数据一样好,所以它们是有用的

在基于散列的集合的情况下,我们使用散列代码(希望)很少发生冲突,因此我们接近O(1)查找,但是如果发生冲突,我们有一些方法来处理它

在加密散列的情况下,我们可能会发生冲突,但故意这样做是非常困难的,原因类似于(粗略地说)为什么很难破坏现代密码学,因此,尽管可能有两个密码具有相同的散列,但很难找到它(特别是如果您不打算使用密码,例如,拥有数千页文本的密码)

在校验和散列的情况下,我们可能会有冲突,但它们不太可能,这意味着如果我们有损坏,我们可能不会有匹配的散列

那么,这里怎么可能没有信息丢失呢

这是不可能的,很多信息都丢失了

在完美散列的情况下,没有冲突,我们甚至可以说信息并没有真正丢失(只是没有单独包含在系统中)因为我们知道所有可能的输入,并且知道在产生的散列中没有冲突,但是它们可以作为索引使用,这种方式对于输入数据来说是不可能的,或者是不太好的,所以它们是有用的

在基于散列的集合的情况下,我们使用散列代码(希望)很少发生冲突,因此我们接近O(1)查找,但是如果发生冲突,我们有一些方法来处理它

在加密散列的情况下,我们可能会发生冲突,但故意这样做是非常困难的,原因类似于(粗略地说)为什么很难破坏现代密码学,因此,尽管可能有两个密码具有相同的散列,但很难找到它(特别是如果您不打算使用密码,例如,拥有数千页文本的密码)


在校验和散列的情况下,我们可能会发生冲突,但这不太可能意味着如果我们有损坏,我们可能不会有匹配的散列。

因此,如果使用散列键执行密码检查,您实际上可以在登录时使用两个或多个密码?是的,但是两个散列完全匹配的机会对于一个好的散列算法几乎为零,因此如果使用哈希键执行密码检查,您实际上可以在登录时使用两个或多个密码?是的,但是两个哈希完全匹配好的哈希算法的可能性几乎为零