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

1

Я пытаюсь использовать частные 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")))

  • 1
    Какой пакет вы используете для функции R base64encode ?
Теги:
hash
md5

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню