将python中的md5哈希生成器转换为R

时间:2018-08-10 14:47:15

标签: python r api hash md5

我正在尝试使用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 <- base64encode(charToRaw(digest(jsonparams, algo="md5")))

1 个答案:

答案 0 :(得分:0)

好吧,有一个陷阱是toJSONjson.dumps对是否在JSON文件中的冒号后面有一个不同的意见。我看到了

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

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

另一件事是,如果要与仅字符串的哈希值匹配,则应将serialize=FALSE与R中的digest()函数一起使用。

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编码的事实根本不会对结果产生任何影响。