R:为什么digest(algo = sha1)会产生与sha1()不同的答案

r0b*_*rts 3 hash r

# what I need
x <- 111111
consistent_output <- hash_function(as.character(x))
Run Code Online (Sandbox Code Playgroud)

我知道这一定有充分的理由,但令我困惑的是为什么在digest图书馆中sha1()digest(,algo=sha1)产生不同的结果。我需要选择在所有机器上给出相同结果的方法。我需要将六到十位数字作为字符串传递,并从单向哈希函数始终获得相同的输出。

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

  2. 如何解释下面的不同结果,如果对于我的脚本我选择 或 ,则 future-proof_ness 是否存在digest(x,algo = "sha1")差异sha1(x)

library(digest)

> digest("111111", algo = "sha1")
[1] "f807e8107b0ee536b79044938ac2497845f43c71"
> sha1("111111")
[1] "e6975dc20e721b2a5cfa6f0d834b2bf8287ab592"
Run Code Online (Sandbox Code Playgroud)

当我说面向未来时,我的意思是 - 如果 10 年后我在相同的输入上运行相同的函数,我希望得到相同的输出。

非常感谢,如果我的问题太简单,我深表歉意 - 我不是来自计算机科学背景。

MrF*_*ick 5

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
Run Code Online (Sandbox Code Playgroud)

所以那里有比字符串值更多的字节。如果您仅使用字符串值,则可以跳过序列化步骤

digest("111111", algo = "sha1", serialize = FALSE)
[1] "3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d"
Run Code Online (Sandbox Code Playgroud)

这将与您在 linux 命令行中得到的内容相匹配

echo -n "111111" | sha1sum
3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d  -
Run Code Online (Sandbox Code Playgroud)

并且还匹配在线计算器,例如http://www.sha1-online.com/

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