Difference of MD5 Hash in R-Librarys - 序列化对象的MD5

Difference of MD5 Hash in R-Librarys - MD5 for serialized objects

我想计算 R 对象的 MD5 哈希值。这通常是通过序列化对象完成的。我知道有两个不同的 R 库可以计算 MD5 哈希值——摘要库和 openssl 库。但是这两个 return 不同的哈希值。这是 openssl 库的示例:

test <- 1:100

library(openssl )
md5(serialize(test, connection = NULL))
# returns: md5 23:a8:b3:40:9e:08:a0:3d:30:6e:3d:3d:cb:fe:21:57 

现在是摘要库的示例:

library(digest)
digest(test,"md5",serialize = T)
# returns: [1] "83777773fa047247723ad5a255963144"

为什么这些哈希值不同?

简答

digest 如果对象被序列化,则跳过一些前导位。

例如:

> .t <- serialize(test, connection = NULL)
> md5(.t[seq(15, length(.t))])
md5 83:77:77:73:fa:04:72:47:72:3a:d5:a2:55:96:31:44

长答案

R版本不同serialize(1:100, connection = NULL)结果不同

根据base::serialize的源代码,R在序列化时写入了一些代表R版本的整数。

digest::digest 在计算 md5sum 之前跳过这些位,因此结果将是一致的。