我正在尝试使用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")))
答案 0 :(得分:0)
好吧,有一个陷阱是toJSON
和json.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编码的事实根本不会对结果产生任何影响。