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 之前跳过这些位,因此结果将是一致的。
我想计算 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 之前跳过这些位,因此结果将是一致的。