哈希函数如何将无限量的数据编码为有限量?

How do Hash-functions encode an infinite amount of data into a finite amount?

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

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

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

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

例如,网站会对用户的密码进行散列处理并存储散列值而不是物理密码。这样,如果网站的安全被破坏,攻击者只能获取哈希值,仍然无法让攻击者登录,因为很难reverse-engineer密码。

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

So how is it possible, that no information is lost here?

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

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

在 hash-based 集合的情况下,我们使用哈希码(希望)有很少的冲突,因此我们接近 O(1) 查找,但如果确实发生冲突,我们有一些方法来处理它发生了。

在密码散列的情况下,我们可能会发生冲突,但由于类似(粗略地说)的原因,为什么很难破解现代密码学,所以故意这样做是非常困难的,所以虽然你可以有两个密码您无法轻易找到相同的哈希值(特别是如果您不打算使用数千页文本的密码)。

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