ruby sha 256 hexidigest 值与 python 生成的不同
ruby sha 256 hexidigest values are different from what python generates
我在 python 中使用 hashlib 库,在 ruby
中使用 Digest::SHA256.hexdigest 库
python我试过了,
import hashlib
hasher = hashlib.sha256()
hasher.update("xyz")
hasher.digest()
hash = hasher.hexdigest()
print hash
输出:3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282
Ruby我试过了,
require 'digest'
hasher = Digest::SHA256.digest "xyz"
hash = Digest::SHA256.hexdigest(hasher)
输出:“18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8”
任何人都可以帮助我理解为什么会有差异吗?如何获得与 python 相同的值?
我使用以下代码得到相同的结果:
Python 3.5.0:
import hashlib
>>> hashlib.sha256("xyz".encode()).hexdigest()
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282'
Ruby 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)。
您要的ruby密码就是
require 'digest'
hash = Digest::SHA256.hexdigest("xyz")
hexdigest
将要消化的字符串作为参数,因此您之前的代码所做的是消化字符串(作为 32 字节的原始数组返回),然后计算该字符串的 SHA256 并格式化为64 个十六进制字符。
ruby 摘要库也有一个 api 类似于您的 python 示例:
hash = Digest::SHA256.new
hash.update 'xyz'
hash.hexdigest
当你想增量计算哈希值时
我在 python 中使用 hashlib 库,在 ruby
中使用 Digest::SHA256.hexdigest 库python我试过了,
import hashlib
hasher = hashlib.sha256()
hasher.update("xyz")
hasher.digest()
hash = hasher.hexdigest()
print hash
输出:3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282
Ruby我试过了,
require 'digest'
hasher = Digest::SHA256.digest "xyz"
hash = Digest::SHA256.hexdigest(hasher)
输出:“18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8”
任何人都可以帮助我理解为什么会有差异吗?如何获得与 python 相同的值?
我使用以下代码得到相同的结果:
Python 3.5.0:
import hashlib
>>> hashlib.sha256("xyz".encode()).hexdigest()
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282'
Ruby 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)。
您要的ruby密码就是
require 'digest'
hash = Digest::SHA256.hexdigest("xyz")
hexdigest
将要消化的字符串作为参数,因此您之前的代码所做的是消化字符串(作为 32 字节的原始数组返回),然后计算该字符串的 SHA256 并格式化为64 个十六进制字符。
ruby 摘要库也有一个 api 类似于您的 python 示例:
hash = Digest::SHA256.new
hash.update 'xyz'
hash.hexdigest
当你想增量计算哈希值时