# what I need
x <- 111111
consistent_output <- hash_function(as.character(x))

我知道这一定有很好的原因,但我很困惑为什么在digest个库中sha1()digest(,algo=sha1)产生不同的结果.我需要 Select 在所有机器上都能得到相同结果的方法.我需要将六到十位数字作为字符串传递,并从单向散列函数中始终获得相同的输出.

  1. 如果在32位系统和64位系统上执行R脚本,结果是否仍有可能不同?我在64位的Linux计算机上编写脚本,但它们很可能需要在各种Windows计算机上执行.

  2. 如何解释下面不同的结果,如果我的脚本 Select digest(x,algo = "sha1")sha1(x),那么在抗future 方面是否存在差异?

library(digest)

> digest("111111", algo = "sha1")
[1] "f807e8107b0ee536b79044938ac2497845f43c71"
> sha1("111111")
[1] "e6975dc20e721b2a5cfa6f0d834b2bf8287ab592"

当我说面向future 时,我的意思是,如果我在10年后对相同的输入运行相同的函数,我希望得到相同的输出.

非常感谢,如果我的问题太简单了,我很抱歉--我不是计算机科学背景的人.

推荐答案

sha1函数将属性添加到您传递的对象中,这样它就可以确切地知道使用了哪些设置来创建散列.然后,这些属性也与数据一起序列化.

函数digest()还可以对数据进行序列化.这意味着将保留存储在R中的对象,而不仅仅是值本身.您可以使用以下命令查看序列化的值

serialize("111111", NULL)
#  [1] 58 0a 00 00 00 03 00 04 02 01 00 03 05 00 00 00 00 05 55 54 46 2d 38 00 00 00 10 00
# [29] 00 00 01 00 04 00 09 00 00 00 06 31 31 31 31 31 31

所以这里有比字符串值多得多的字节.如果您只使用字符串值,则可以跳过序列化步骤

digest("111111", algo = "sha1", serialize = FALSE)
[1] "3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d"

这将与您在Linux命令行中获得的结果相匹配

echo -n "111111" | sha1sum
3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d  -

也匹配像http://www.sha1-online.com/这样的在线计算器

因此,如果您需要与非R系统兼容,那么我建议使用digest()serialize=FALSE,因为在其他语言中,值的序列化方式可能会有所不同.如果您只需要担心R,那么使用sha1可能会更安全,请记住,它在对象中包含了影响结果散列的额外信息

R相关问答推荐

在R中使用GG Plot时如何 suppress 等值线图中的彩色条

为什么stat_bin在R中的ggplot中显示错误的数字?

将数据集中的值增加到当前包含的最大值

Ggplot2中的重复注记

使用Facet_WRAP时更改框图中线的 colored颜色

`lazy_dt`不支持`dplyr/across`?

R中边际效应包中Logistic回归的交互作用风险比

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

SHINY:使用JS函数应用的CSS样式显示HTML表格

将多个变量组合成宽格式

如何计算增加10米(0.01公里)的行?

如何提取R中其他字符串和数字之间的字符串?

`-`是否也用于数据帧,有时使用引用调用?

是否可以将线性模型的p值添加到tbl_summary中

如何预测原始数据集并将值添加到原始数据集中

使用ifElse语句在ggploy中设置aes y值

如何显示准确的p值而不是<;0.001*?

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

将美学添加到ggploy中的文本标签

在一个multiplot中以非对称的方式在R中绘制多个图