ruby sha 256 hexidigest值与python生成的值不同

时间:2015-11-17 22:50:39

标签: python ruby sha256 digest hashlib

我在python中使用hashlib库,在ruby中使用Digest :: SHA256.hexdigest库

我正在尝试的Python代码,

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

输出:3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282

Ruby Code我正在尝试,

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

输出:" 18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8"

任何人都可以帮助我理解为什么会有区别吗?我怎样才能获得与python相同的值?

2 个答案:

答案 0 :(得分:4)

你想要的ruby代码只是

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

hexdigest将要消化的字符串作为参数,因此您之前的代码正在做的是消化字符串(返回为32字节的原始数组),然后计算该字符串的SHA256。格式化为64个十六进制字符。

ruby​​ digest库也有一个类似于你的python示例的api:

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

当您想要逐步计算哈希时

答案 1 :(得分:0)

使用以下代码得到相同的结果:

Python 3.5.0:

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

Ruby 2.2.3

require 'digest'
irb(main):001:0> Digest::SHA256.hexdigest("xyz")
=> "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282"

OR

irb(main):002:0> H = Digest::SHA256.new()
=> #<Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
irb(main):003:0> H << "xyz"
=> #<Digest::SHA256: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282>
irb(main):004:0> 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。)