Python的hashlib.sha256(x).hexdigest()相当于Rs摘要(x,algo =“sha256”)

时间:2015-07-03 14:43:12

标签: python r

我不是python程序员,但我正在尝试将一些Python代码翻译成R.我遇到问题的python代码是:

hashlib.sha256(x).hexdigest()

我对这段代码的解释是该函数将使用sha256算法计算x的散列并以十六进制形式返回值。

鉴于这种解释,我使用以下R函数:

digest(x, algo="sha256", raw=FALSE)

基于我虽然对R的知识有限以及我在线阅读Python的hashlib函数,但这两个函数应该产生相同的结果,但它们不是。

我错过了什么或者我使用了错误的R功能。

1 个答案:

答案 0 :(得分:9)

是的,Python和R示例代码都返回传入数据的SHA256哈希摘要的十六进制表示。

您需要在R中关闭序列化,否则digest()包首先创建字符串的序列化,而不是仅计算字符数据的哈希值;将serialize设置为FALSE

> digest('', algo="sha256", serialize=FALSE)
[1] "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
> digest('hello world', algo="sha256", serialize=FALSE)
[1] "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"

这些匹配他们的Python等价物:

>>> import hashlib
>>> hashlib.sha256('').hexdigest()
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
>>> hashlib.sha256('hello world').hexdigest()
'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'

如果你的哈希值在R和Python之间仍然不同,那么你的数据是不同的。这可能是一个微妙的行尾的换行符,或者开头的字节顺序标记。

在Python中,检查print(repr(x))的输出以将数据表示为Python字符串文字;这会将不可打印的字符显示为转义序列。我确定R有类似的调试工具。 R和Python在使用交互模式时都将字符串值作为表示形式进行回应。