Я пытаюсь использовать частные API-интерфейсы Cryptopia. Для использования частного API требуется кодировка MD5 с кодировкой Base5 из PostScript. Я нашел код python из https://github.com/thebotguys/cryptopia-api-python/blob/master/cryptopia_api.py
При переводе кода в 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')
Р:
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")))
Ну, один улов заключается в том, что toJSON
и json.dumps
имеют разные мнения относительно того, нет или нет, должно быть место после двоеточия в файле JSON. я вижу это
# pyhton
jsonparams
# '{"Currency": "BTC"}
# R
cat(jsonparams)
# {"Currency":"BTC"}
Поэтому, поскольку строки отличаются друг от друга, они не будут иметь точный MD5-хэш. Но если API не имеет очень строгих правил пробела, это не должно быть слишком большой проблемой.
Другое дело, что если вы хотите совместить хэши только строк, вы должны использовать serialize=FALSE
с функцией digest()
в R.
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, в действительности не будет иметь никакого значения.
base64encode
?