我不是python程序员,但我正在尝试将一些Python代码转换为R.我遇到的一段python代码是:
hashlib.sha256(x).hexdigest()
Run Code Online (Sandbox Code Playgroud)
我对这段代码的解释是该函数将使用sha256算法计算x的散列并以十六进制形式返回值.
鉴于这种解释,我使用以下R函数:
digest(x, algo="sha256", raw=FALSE)
Run Code Online (Sandbox Code Playgroud)
基于我虽然有限的R知识和我在线阅读的Python的hashlib函数,这两个函数应该产生相同的结果,但它们不是.
我错过了什么或者我使用了错误的R功能.
Mar*_*ers 10
是的,Python和R示例代码都返回传入数据的SHA256哈希摘要的十六进制表示.
您需要在R中关闭序列化,否则您digest()首先会创建字符串的序列化,而不是仅计算字符数据的哈希值; 设置serialize到FALSE:
> digest('', algo="sha256", serialize=FALSE)
[1] "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
> digest('hello world', algo="sha256", serialize=FALSE)
[1] "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
Run Code Online (Sandbox Code Playgroud)
这些匹配他们的Python等价物:
>>> import hashlib
>>> hashlib.sha256('').hexdigest()
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
>>> hashlib.sha256('hello world').hexdigest()
'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
Run Code Online (Sandbox Code Playgroud)
如果您的哈希值在R和Python之间仍然不同,那么您的数据就不同了.这可能是一个微妙的行尾的换行符,或者开头的字节顺序标记.
在Python中,检查输出print(repr(x))以将数据表示为Python字符串文字; 这会将不可打印的字符显示为转义序列.我确信R有类似的调试工具.在使用交互模式时,R和Python都将字符串值作为表示形式进行回显.