Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 像MD5这样的散列函数是如何唯一的?_Hash_Theory_Md5_Uniqueidentifier - Fatal编程技术网

Hash 像MD5这样的散列函数是如何唯一的?

Hash 像MD5这样的散列函数是如何唯一的?,hash,theory,md5,uniqueidentifier,Hash,Theory,Md5,Uniqueidentifier,我知道MD5有一些冲突,但这更多的是关于散列函数的高级问题 如果MD5将任意字符串散列为32位十六进制值,那么根据规则,这肯定不是唯一的,因为唯一的任意字符串比唯一的32位十六进制值多。您完全正确。但是散列不是关于“唯一”,而是关于“足够唯一”。(它似乎是散列函数。) 加密散列函数被设计成具有非常、非常、非常低的复制率。由于你所说的显而易见的原因,利率永远不能为零 是信息性的。您是正确的,它不能保证唯一性,但是32位十六进制值(16^32)中大约有3.402823669209387e+38个不同

我知道MD5有一些冲突,但这更多的是关于散列函数的高级问题


如果MD5将任意字符串散列为32位十六进制值,那么根据规则,这肯定不是唯一的,因为唯一的任意字符串比唯一的32位十六进制值多。

您完全正确。但是散列不是关于“唯一”,而是关于“足够唯一”。

(它似乎是散列函数。)

加密散列函数被设计成具有非常、非常、非常低的复制率。由于你所说的显而易见的原因,利率永远不能为零


是信息性的。

您是正确的,它不能保证唯一性,但是32位十六进制值(16^32)中大约有3.402823669209387e+38个不同的值。这意味着,假设算法背后的数学给出了一个良好的分布,那么出现重复的几率非常小。你必须记住,当你考虑如何使用它时,复制是可能的。MD5通常用于确定某些内容是否已更改(即,它是一个校验和)。修改某些内容并产生相同的MD5校验和是不太可能的

编辑:(给出最近的新闻re:SHA1散列) 上面的答案仍然成立,但您不应该期望MD5哈希作为任何类型的安全检查来防止操纵。SHA-1散列为2^32(超过40亿)倍,碰撞的可能性更小,并且已经证明,设计输入以产生相同的值是可能的。(这在相当长一段时间前针对MD5进行了演示)。如果您希望确保没有人恶意修改某些内容以生成相同的哈希值,那么现在,您需要在SHA-2上有一个可靠的保证

另一方面,如果它不在安全检查上下文中,MD5仍然有它的用处

可以提出这样的论点:SHA-2散列计算起来足够便宜,你无论如何都应该使用它。

正如Mike(以及其他人)所说,它并不完美,但它确实起到了作用,碰撞性能实际上取决于算法(实际上相当好)


真正令人感兴趣的是自动操纵文件或数据,用不同的数据保持相同的哈希值,参见此

正如其他人所回答的,哈希函数根据定义不保证返回唯一值,因为对于无限多的输入,有固定数量的哈希值。它们的关键特性是它们的碰撞是不可预测的


换句话说,它们不容易可逆——因此,尽管可能有许多不同的输入会产生相同的散列结果(“冲突”),但从计算上来说,找到其中任何两个都是不可行的。

根据定义,加密单向散列函数是不可行的。
就散列函数而言,“unique”是毫无意义的。这些函数是由其他属性度量的,这些属性通过使给定哈希的预映像难以创建而影响它们的强度。例如,我们可能关心更改预图像中的单个位会影响多少图像位。我们可能关心执行暴力攻击(为给定的哈希图像查找prie图像)有多困难。我们可能关心查找冲突有多困难:查找具有相同哈希图像的两个预映像,以便在冲突中使用

正如其他人所指出的,像MD5这样的散列函数的目标是提供一种方法来轻松检查两个对象是否相等,而不知道它们最初是什么(密码),也不比较它们的整体(大文件)

假设您有一个对象
O
及其哈希值hO。您获得另一个对象
P
,并希望检查它是否等于
O
。这可能是一个密码,也可能是您下载的文件(在这种情况下,您没有
O
,而是
P
附带的hash文件)。首先,您散列
P
以获得hP

现在有两种可能性:

  • hO和hP是不同的。这一定意味着
    O
    P
    是不同的,因为对两个值/对象使用相同的哈希必须产生相同的值。哈希是确定性的没有假阴性。
  • hO和hP是平等的。正如您所说的,由于鸽子洞原则,这可能意味着不同的对象散列到相同的值,可能需要采取进一步的措施

    a。因为可能性的数量是如此之多,如果你对你的散列函数有信心,那么说“好吧,在2128次碰撞中有1次机会(理想情况)”就足够了,因此我们可以假设
    O
    =
    P
    。例如,如果您限制字符的长度和复杂性,这可能适用于密码。这就是为什么您会看到存储在数据库中的密码哈希,而不是密码本身。 b、 您可能会认为,仅仅因为散列结果相等并不意味着对象相等,并且直接比较
    O
    P
    可能会得到假阳性。


  • 因此,虽然您可能有误报匹配,但不会有误报。根据您的应用程序,以及您是否希望对象始终相等或始终不同,哈希可能是多余的步骤。

    如果要哈希的值比结果哈希长得多,则可能会发生冲突,但nu在大多数情况下,冲突的数量仍然足够低(总共有2128个散列,因此两个随机字符串产生相同散列的概率理论上接近1038分之一)

    MD5最初是为了进行完整性检查而创建的,因此它对最小的更改非常敏感。输入中的一个小修改将导致输出的显著不同。这就是为什么很难对MD5进行完整性检查