R包中的MD5文件是用于什么目的?它是如何生成的?

11

我注意到许多R包的目录中都有一个名为“MD5”的文件。然而在“Writing R Extensions”手册中没有这个文件的提及。它会列出包中不同文件的MD5哈希值和文件名。

这个文件有什么用?我应该将其包含在我的软件包中吗?如何生成它?


你查看过 ?md5sum 吗? - Mark O'Connell
是的。它可以为您提供一个文件列表的MD5哈希值,但它不会告诉您这个文件是用于什么或以相同的方式格式化输出。 - Matthew Lueder
4个回答

9
在R软件包中找到的MD5哈希文件用于在存储库(例如CRAN)上唯一标识src软件包。具体来说,当软件包在存储库中列出时,软件包的元数据将添加到名为PACKAGES的文件中。当用户通过install.packages()请求软件包时,将触发下载以检查MD5哈希值。这在?md5sum函数中已经说明。

MD5摘要用作检查R软件包是否已正确解压缩且未被修改的检查。

PACKAGES文件的内部将如下所示:
Package: datapkg
Version: 2.0.0
Depends: R (>= 3.2)
License: file LICENSE
MD5sum: 22797605db853f5f4c2c5612da366b53
NeedsCompilation: no

如需了解有关使用 install.packages() 与仓库一起使用的更多信息,请参见我编写的文章:

http://thecoatlessprofessor.com/programming/r-data-packages-in-external-data-repositories-using-the-additional_repositories-field/


链接已损坏。 - hyginn
1
DESCRIPTION 中的 MD5sum: 行并不是与软件包 MD5 文件相同的东西。该文件有不同的用途。请参见下面的答案。 :-) - hyginn

5
该文件作为tools::checkMD5sums()的输入,用于检查安装包的完整性。文件格式可以从代码中逆向工程获得:一个文本文件,每个包含的文件都有一行,其中包含MD5哈希值、*分隔符和相对于指定根目录的文件路径。您可以手动从tools::md5sum()的输出中创建这些内容 - 或者您可以使用我在此Gist中提供的函数,并在其中更详细地讨论此问题。

1
非常好的Gist!但是请注意,确实存在用于生成MD5文件的内部函数(请参见此答案)。 - merv
谢谢,是的 - 你说得对。请记住,未导出的函数可能随时更改,通常不容易发现,并且由于没有关于它们意图的注释,使用它们需要做出假设。 - hyginn

1

生成MD5文件

有一个非导出函数tools:::.installMD5sums(pkgDir, outDir = pkgDir)可以生成MD5文件。这里我已经注释了关键步骤:

## compute check sum for every file in package
x <- md5sum(dir(".", recursive = TRUE))

## exclude any existing "MD5" file
x <- x[names(x) != "MD5"]

## write each result out to the "MD5" file
cat(paste(x, names(x), sep = " *"), sep = "\n", 
    file = file.path(outDir, "MD5"))

可以这样使用:

tools:::.installMD5sums("/path/to/pkg/")

-1

我通过谷歌搜索了解如何获取文件的MD5哈希值,最终来到了这里。这种方法简单而有效:

library(openssl)
as.character(md5(file("path/to/yourfile.txt", open = "rb")))
# [1] "30621b64b2232a67900738ab471f2067"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接