Значения ruby ​​sha 256 hexidigest отличаются от того, что генерирует python

Я использую библиотеку hashlib в python и библиотеку Digest::SHA256.hexdigest в ruby.

С питоном я пробовал,

import hashlib
hasher = hashlib.sha256()
hasher.update("xyz")
hasher.digest()
hash = hasher.hexdigest()
print hash

вывод: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282

С Руби я пытался,

require 'digest'
hasher   = Digest::SHA256.digest "xyz"
hash   = Digest::SHA256.hexdigest(hasher)

вывод: "18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8"

Может ли кто-нибудь помочь мне понять, почему есть разница? как я могу получить то же значение, что и python?


person Hound    schedule 17.11.2015    source источник


Ответы (2)


Рубиновый код, который вам нужен, просто

require 'digest'
hash   = Digest::SHA256.hexdigest("xyz")

hexdigest принимает в качестве аргумента строку для переваривания, поэтому ваш предыдущий код перерабатывал строку (возвращая в виде необработанного массива из 32 байтов), а затем вычислял SHA256 этого и форматировал как 64 шестнадцатеричных символа.

Библиотека дайджеста ruby ​​​​также имеет API, аналогичный вашему примеру python:

hash = Digest::SHA256.new
hash.update 'xyz'
hash.hexdigest

Когда вы хотите вычислить хеш постепенно

person Frederick Cheung    schedule 17.11.2015

Я получаю те же результаты, используя следующий код:

Питон 3.5.0:

import hashlib
>>> hashlib.sha256("xyz".encode()).hexdigest()
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282'

Руби 2.2.3

require 'digest'

Digest::SHA256.hexdigest("xyz")
# => "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282"

OR

H = Digest::SHA256.new
# => #<Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
H << "xyz"
# => #<Digest::SHA256: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282>
H.hexdigest
# => "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282"

Проблема заключалась (на мой взгляд) в том, что:

hasher = Digest::SHA256.digest("xyz")
# => "6\b\xBC\xA1\xE4N\xA6\xC4\xD2h\xEBm\xB0\"`&\x98\x92\xC0\xB4+\x86\xBB\xF1\xE7zo\xA1l<\x92\x82"`

который не является "xyz:". (отказ от ответственности: в прошлом я почти не использовал Ruby).

person jermenkoo    schedule 17.11.2015