Перевести генератор хэшей md5 из python в r

Я пытаюсь использовать частные API Cryptopia. Чтобы использовать частный API, необходим хеш-код MD5 параметров публикации в кодировке Base64. Я нашел код 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")))

Какой пакет вы используете для функции R base64encode?

MrFlick 10.08.2018 17:32
1
1
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, одна загвоздка заключается в том, что 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, действительно не повлияет на результат.

Другие вопросы по теме