我想使用R做一个文件的sha1总和。
我的系统是运行RStudio 1.4的Windows 10。
这有效:
md5sum <- md5sum(file)
这不是:
sha1sum <- sha1sum(file)
“找不到函数sha1sum”
比较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(.)
in 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=
。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句