【问题标题】:Is Python's hashlib.sha256(x).hexdigest() equivalent to Rs digest(x,algo="sha256")Python 的 hashlib.sha256(x).hexdigest() 是否等同于 Rs digest(x,algo="sha256")
【发布时间】:2018-07-23 07:21:38
【问题描述】:

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

hashlib.sha256(x).hexdigest()

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

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

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

根据我虽然有限的 R 知识以及我在 Python 的 hashlib 函数上在线阅读的内容,这两个函数应该产生相同的结果,但事实并非如此。

是我遗漏了什么还是我使用了错误的 R 函数。

【问题讨论】:

    标签: python r


    【解决方案1】:

    是的,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 都回显字符串值作为表示。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2014-02-14
      • 1970-01-01
      • 2013-12-11
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多