Python 为什么从不同的文件格式进行散列时散列值会发生变化?

Python 为什么从不同的文件格式进行散列时散列值会发生变化?,python,hash,cryptography,digital-signature,sha256,Python,Hash,Cryptography,Digital Signature,Sha256,我观察到,当我对*.txt文件和*.docx文件中的数据进行散列时,生成的两个散列是不同的,即使两个文件中的数据相同。 为什么会发生这种情况?加密哈希函数在某种意义上是随机的,但却是确定性函数。确定性意味着相同的值将产生相同的哈希值。它们是随机的,因为散列的值是不可预测的 您的txt和docx文件虽然具有相同的文本,但在二进制中它们将不同。您可以将它们与diff命令进行比较,并查看差异。此外,您可以看到它们将具有不同的文件大小 只要您不是很幸运,我们不希望您发现两个不同的输入具有相同值的冲突。您

我观察到,当我对*.txt文件和*.docx文件中的数据进行散列时,生成的两个散列是不同的,即使两个文件中的数据相同。
为什么会发生这种情况?

加密哈希函数在某种意义上是随机的,但却是确定性函数。确定性意味着相同的值将产生相同的哈希值。它们是随机的,因为散列的值是不可预测的

您的txt和docx文件虽然具有相同的文本,但在二进制中它们将不同。您可以将它们与
diff
命令进行比较,并查看差异。此外,您可以看到它们将具有不同的文件大小


只要您不是很幸运,我们不希望您发现两个不同的输入具有相同值的冲突。

您只能以字节块的形式散列值的表示形式。因此,即使您将完全相同的值表示为两个不同的字节块,它们也不会有相同的散列。如果需要它们相同,则必须将获取值的表示形式转换为规范表示形式

当表示中的某些信息与值无关时,就会出现此问题。例如,这两个字符串肯定有不同的哈希:

{ "id" : 1, "value" : "moo" }
以及:

然而,在JSON中,它们表示完全相同的值。如果它们没有对JSON对象进行编码,那么关键是它们的散列方式不同。如果它们确实编码JSON,那么它们散列相同的内容是至关重要的。但是,当然,哈希算法不知道它所哈希的东西是否编码JSON。所以这不可能是散列算法的责任


您需要代码来确保相同值的两个不同表示形式向哈希算法呈现相同的表示形式。这是你的责任——哈希算法不可能做到这一点。

在这两种情况下使用的字符编码是什么?你怎么知道它们是一样的?我已经在一个txt文件和一个docx文件中写了hello这个词。文本文件为1kb,docx为12kb,因此当内容相同时,docx可能会保存更多与文档及其格式相关的数据。您错了:“两个文件中的数据相同”。它们看起来很相似,但它们不一样!不管怎么说,哈希是在文件数据(字节)上工作的,而不是在“内容”上。非常确定哈希函数不涉及“随机性”!SamMason Random在第二句中解释道,“不可预测”是一个更好的术语,也许就用它吧
它们是随机的,因为散列的值是不可预测的。
{ "value" : "moo", "id" : 1 }