我想用R做一个文件的sha1和。
我的系统是运行RStudio 1.4的Windows 10。
这样做是可行的:
md5sum <- md5sum(file)这并不是:
sha1sum <- sha1sum(file)“找不到函数sha1sum”
发布于 2021-02-13 21:52:08
openssl::sha1与digest::sha1的比较
writeLines("foo", "quux.txt")
system2("sha1sum", c("quux.txt"), stdout = TRUE)
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133 *quux.txt"
as.character(openssl::sha1(file("quux.txt")))
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133"
digest::sha1("quux.txt")
# [1] "ad1a86aea4360a7d5c5fb0265f00438f6d7664a2"这就开始显示出问题所在,一个人和其他人意见不一致。查看正在发生的事情的一种方法是更改文件的内容,但保持文件名不变:
writeLines("foofoofoo", "quux.txt")
as.character(openssl::sha1(file("quux.txt")))
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e"
system2("sha1sum", c("quux.txt"), stdout = TRUE)
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e *quux.txt"
digest::sha1("quux.txt")
# [1] "ad1a86aea4360a7d5c5fb0265f00438f6d7664a2"前两个更改(这是预期的),并保持不变,但第三个来自digest::sha1没有改变,尽管内容已经改变。虽然理论上可能有两个内容不同的文件可以生成相同的SHA1校验和,但事实并非如此。
顺便说一句:根据您的使用情况,SHA1不再推荐用于安全散列,而更倾向于使用SHA256或SHA512或其他更强的哈希函数。
另一个BTW:别忘了file(.)在openssl::sha1中的使用,否则你就犯了同样的错误。
writeLines("foo", "quux.txt")
openssl::sha1("quux.txt")
# [1] "08a72b849478907ae9de2ff46ba53ce6aeeba360"
as.character(openssl::sha1(file("quux.txt")))
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133"
writeLines("foofoofoo", "quux.txt")
openssl::sha1("quux.txt")
# [1] "08a72b849478907ae9de2ff46ba53ce6aeeba360"
### has not changed!
as.character(openssl::sha1(file("quux.txt")))
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e"在这一点上,帮助医生可能不是很清楚。来自?openssl::sha1
x: character vector, raw vector or connection object.它对字符串或文件的操作是多态的.而且,尽可能方便,它也可以引导(经常!)对正在发生的事情的误解。如果您想一想,函数如何知道您要寻找的是一个文件?如果它使用file.exists检查它是否存在,那么它将给出文件内容的校验和;如果不是,则给出字符串的校验和。如果您运行该代码并期望它检查一个文件,并且该文件不存在,我希望会有一个错误,但是返回您认为是一个文件的字符串的校验和,函数认为是一个字符串.打破用例中的许多假设。(我建议他们使用明确的参数,如text=和file=或con=。)
https://stackoverflow.com/questions/66190006
复制相似问题