【问题标题】:Translate md5 hash generator in python into R将python中的md5哈希生成器翻译成R
【发布时间】:2019-01-18 05:12:49
【问题描述】:

我正在尝试使用 Cryptopia 的私有 API。为了使用私有 API,需要对 post 参数进行 Base64 编码的 MD5 哈希。我从https://github.com/thebotguys/cryptopia-api-python/blob/master/cryptopia_api.py找到了一个python代码

在将代码翻译成 R 时,md5 哈希生成器给我带来了麻烦。 python 和 R 的哈希结果不同。请填写如何解决。

Python:

post_parameters = {'Currency': 'BTC'}
post_data = json.dumps(post_parameters)
md5 = hashlib.md5()
jsonparams = post_data.encode('utf-8')
md5.update(jsonparams)
rcb64 = base64.b64encode(md5.digest()).decode('utf-8')

R:

post_parameters <- list("Currency" = "BTC")
post_data <- jsonlite::toJSON(post_parameters, auto_unbox=T)
jsonparams <- stri_enc_toutf8(post_data, is_unknown_8bit = FALSE, validate = FALSE)
rcb64 <- base64encode(digest(jsonparams, algo="md5", raw=T)

我尝试了这个,而不是最后一行,但它也产生了另一个结果。

rcb64 &lt;- base64encode(charToRaw(digest(jsonparams, algo="md5")))

【问题讨论】:

  • R base64encode 函数使用什么包?

标签: python r api hash md5


【解决方案1】:

嗯,一个问题是toJSONjson.dumps 对于 JSON 文件中的冒号后面是否应该有空格有不同的看法。我看到了

# pyhton
jsonparams
# '{"Currency": "BTC"} 
# R
cat(jsonparams)
# {"Currency":"BTC"}

因此,由于字符串不同,它们不会具有完全相同的 MD5 哈希值。但除非 API 有非常严格的空格规则,否则这应该不是什么大问题。

另一件事是,如果您只想匹配字符串的哈希值,您应该在 R 中使用 serialize=FALSEdigest() 函数。

rcb64 <- digest::digest(jsonparams, algo="md5", serialize = FALSE, raw=TRUE)

假设您从相同的输入字符串开始,这将在 R 和 Pyhton 之间返回相同的结果。例如

# R
RCurl::base64Encode(digest::digest("hello", algo="md5", serialize = FALSE, raw=TRUE))
# [1] "XUFAKrxLKna5cZ2REBfFkg=="

# python
md5 = hashlib.md5()
md5.update("hello")
base64.b64encode(md5.digest())
# 'XUFAKrxLKna5cZ2REBfFkg=='

由于您的字符串中似乎只有 ASCII 值,因此您需要 UTF-8 编码这一事实实际上不会对结果产生任何影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2011-07-26
    • 2011-08-17
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多