【问题标题】:getting long hexadecimal hash越来越长的十六进制哈希
【发布时间】:2020-01-22 23:25:39
【问题描述】:

如何将此 python 代码转换为 R?

import hashlib

def str_buckets(a, b, buckets):
  return (int(hashlib.md5(str(a + ',' + b).encode('utf-8')).hexdigest(), 16) & 4294967295) % buckets

我会写

hashlib.md5(b'x,y').hexdigest()

digest::digest("x,y", algo="md5", serialize=FALSE)

他们都给了我f10bc3c94b77e1d6b9f98106daf335c1的输出

但是在 python 中

int(hashlib.md5(b'x,y').hexdigest(), 16)

正在输出320405033267698290319193645506345776577

是否存在与pythonint(<>, 16) 等效的R?

【问题讨论】:

  • R 中转换为整数可以使用as.integer 来完成。这是你要找的吗?
  • 它不仅仅是整数,它将是基数为 16 的整数,这就是 python 代码的作用。在R 中的指定320405033267698290319193645506345776577 中找不到任何要转换的函数
  • 你能试试Rmpfr package: cran.r-project.org/web/packages/Rmpfr/Rmpfr.pdf 并使用mpfr base 16 函数
  • 或许直接通过reticulate包使用python代码?试试py_run_string("num = int('516',16)")
  • reticulate 是我目前使用source_python 对整个python 定义所做的事情,但我正在使用plumber 创建一个API 并在R 中调用python 定义,这让它变慢了跨度>

标签: python r encryption hash cryptography


【解决方案1】:

正如 cmets 中所建议的,R 没有处理大整数(仅 32 位)的本机能力。这将给出正确的答案:

d <- digest::digest("x,y", algo="md5", serialize=FALSE)
library(Rmpfr)
m <- mpfr(d,precBits=200,base=16)
## 1 'mpfr' number of precision  200   bits 
## [1] 320405033267698290319193645506345776577

但在 R 中进一步处理此问题可能具有挑战性。我什至没有找到一种方法来获得一个比它更干净的字符串:

gsub("\\.0+$","",format(m))
## [1] "320405033267698290319193645506345776577"

安装Rmpfr 包需要安装MPFRGMP

【讨论】:

    【解决方案2】:

    【讨论】:

    • 这将很难,因为原始值对于 R 的整数类型来说太大了(R 没有任意大小的整数,除非你转到 Rmpfr
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多