gpt4 book ai didi

crystal-lang - Crystal : How can I find the SHA256 hash of a binary value?

转载 作者:行者123 更新时间:2023-12-04 04:24:57 32 4
gpt4 key购买 nike

我是 Crystal 的新手。我想尝试找到十六进制字符串的 SHA256 哈希值。我设法让一些工作:

sha256 = OpenSSL::Digest.new("sha256")
puts sha256.update("abcd")

但是我不确定如何将“abcd”的二进制值放入散列函数中,或者得到二进制值。我基本上希望能够重新创建这个 Ruby 函数:
def hash256(hex)
# 1. Convert hex string to array, and pack in to binary
binary = [hex].pack("H*")

# 2. Hash the binary value (returns binary)
hash1 = Digest::SHA256.digest(binary)

# 3. Hash it again (returns binary)
hash2 = Digest::SHA256.digest(hash1)

# 4. Convert back to hex (must unpack as array)
result = hash2.unpack("H*")[0]

return result
end

是否可以在 Crystal 中使用带有二进制值的 SHA256?

最佳答案

将一串十六进制字符解码成二进制切片目前不是 Crystal 标准库的一部分,所以我自己写了一个解码函数:

def hex_decode(hex)
return unless hex.size % 2 == 0

slice = Slice(UInt8).new(hex.size / 2)
0.step(to: hex.size - 1, by: 2) do |i|
high_nibble = hex.to_unsafe[i].unsafe_chr.to_u8?(16)
low_nibble = hex.to_unsafe[i + 1].unsafe_chr.to_u8?(16)
return unless high_nibble && low_nibble

slice[i / 2] = (high_nibble << 4) | low_nibble
end

slice
end

此函数采用包含十六进制字符的 String,然后将其解码为 Slice(UInt8)(如果十六进制无效,则返回 nil)。

那么与您上面粘贴的 ruby​​ 代码等效的完整代码将是:
def hash256(hex_string)
data = hex_decode(hex_string)
raise "Invalid hexadecimal" unless data

hash = OpenSSL::Digest.new("SHA256")
hash.update(data)
hash1 = hash.digest

hash = OpenSSL::Digest.new("SHA256")
hash.update(hash1)

hash.hexdigest
end

尽管我不得不质疑您为什么要使用 SHA256 两次。我建议像这样更改哈希函数:
def hash256(hex_string)
data = hex_decode(hex_string)
raise "Invalid hexadecimal" unless data

hash = OpenSSL::Digest.new("SHA256")
hash.update(data)

hash.hexdigest
end

关于crystal-lang - Crystal : How can I find the SHA256 hash of a binary value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42299037/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com