我在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相同的值?
答案 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)
使用以下代码得到相同的结果:
import hashlib
>>> hashlib.sha256("xyz".encode()).hexdigest()
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282'
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。)