我不是python程序员,但我正在尝试将一些Python代码转换为R。我遇到问题的python代码片段是:
hashlib.sha256(x).hexdigest()
我对这段代码的解释是,该函数将使用sha256算法计算x的散列值,并返回十六进制的值。
根据这种解释,我将使用以下R函数:
digest(x, algo="sha256", raw=FALSE)
基于我有限的R知识和我在网上读到的Python的hashlib函数,这两个函数应该会产生相同的结果,但事实并非如此。3.
是我遗漏了什么,还是我用错了R函数。
发布于 2015-07-03 22:50:55
是的,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都回显字符串值作为表示。
https://stackoverflow.com/questions/31209425
复制相似问题