无论谁在何处执行散列计算,MD5散列都应该返回相同的值。
然而,在同一文件上使用三种不同的方法,我们会看到三种不同的答案(!?)。
文件是Here的。
MD5散列according to Amazon Web Services为:
library(dplyr)
"https://collidr-api.s3-ap-southeast-2.amazonaws.com/pfd.RDS" %>% curlGetHeaders %>% .[6] %>% trimws %>%
strsplit(., "ETag: ") %>% .[[1]] %>% .[2] %>%
{ substr(., 2, nchar(.)) } %>% { substr(., 1, nchar(.) - 1)}
# "a921f713fbd730a51814fb6602048c16"MD5散列using the digest library为
library(digest)
digest("Downloads/pfd.RDS", algo=c("md5"))
# "2b049aba0269e46d35780c3e7d29a916"而MD5散列using openssl library是
library(openssl)
md5("Downloads/pfd.RDS")
# "8ceabf9bdd146ed12ba89533cd593d12"我无法解释这个。我认为这三个值应该是相同的,因为它们都对同一文件应用了相同的算法(MD5),但这三个值是不同的。
问题
为什么无论用什么方法生成文件的MD5哈希,哈希值都不一样,最重要的是,我如何计算R中的哈希值,使其与亚马逊网络服务提供的MD5哈希(即a921f713fbd730a51814fb6602048c16)相匹配?
更新
在mac终端中,md5 Downloads/pfd.RDS返回a921f713fbd730a51814fb6602048c16 (与AWS值一致)。仍然不清楚为什么digest::digest()和openssl::md5()的值是不同的。
发布于 2020-01-21 11:59:12
如果你想散列该路径下的文件内容,你需要告诉每个函数。试一试
digest("Downloads/pfd.RDS", file=TRUE, algo="md5")和
md5(file("Downloads/pfd.RDS", open="rb"))否则,您就是在散列路径名本身。
在简单的情况下,这些函数返回相同的值
cat("hello", file="hello.txt")
digest("hello.txt", file=TRUE, algo="md5")
# [1] "5d41402abc4b2a76b9719d911017c592"
md5(file("hello.txt", open="rb"))
# md5 5d:41:40:2a:bc:4b:2a:76:b9:71:9d:91:10:17:c5:92 https://stackoverflow.com/questions/59833931
复制相似问题