F# SHA256Managed 问题,输出哈希删除 0
Issue with F# SHA256Managed, output hash Removes 0's
我正在尝试使用 F# 编写一个函数来计算任何给定字符串的 SHA256 哈希值。当我将我的函数生成的哈希值与该网站 (https://xorbin.com/tools/sha256-hash-calculator) 生成的哈希值进行比较时,我的哈希值的长度总是小于 64。仔细检查后,我注意到我的哈希值省略了一些 0 值。我怀疑我对字符串的编码方式有问题,但我不确定。关于导致问题的原因以及如何解决它的任何想法?
函数如下:
open System.Security.Cryptography
open System.Text
let calculateHash (inputString: string) =
Encoding.UTF8.GetBytes(inputString)
|> (new SHA256Managed()).ComputeHash
|> Seq.iter (printf "%x")
printfn ""
例如,这里是字符串“Test”的散列:
网站生成:
532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25
我的函数生成:
532eaabd957488dbf76b9b8cc0832c20a6ec113d68229955d7a6ef345e25
问题不是你的计算,而是你的打印。
您正在迭代单个字节并使用 printf "%x"
打印它们。这会将字节打印为十六进制值,但对于小于 16 的数字,这只是一个字符 - 所以如果你 printf "%x" 10
,结果只是 a
- 你需要用空格和得到 0a
.
为此,您可以将格式字符串更改为 %02x
,其中 0
和 2
表示用零填充,总长度为 2 个字符:
let calculateHash (inputString: string) =
Encoding.UTF8.GetBytes(inputString)
|> (new SHA256Managed()).ComputeHash
|> Seq.iter (printf "%02x")
printfn ""
我正在尝试使用 F# 编写一个函数来计算任何给定字符串的 SHA256 哈希值。当我将我的函数生成的哈希值与该网站 (https://xorbin.com/tools/sha256-hash-calculator) 生成的哈希值进行比较时,我的哈希值的长度总是小于 64。仔细检查后,我注意到我的哈希值省略了一些 0 值。我怀疑我对字符串的编码方式有问题,但我不确定。关于导致问题的原因以及如何解决它的任何想法?
函数如下:
open System.Security.Cryptography
open System.Text
let calculateHash (inputString: string) =
Encoding.UTF8.GetBytes(inputString)
|> (new SHA256Managed()).ComputeHash
|> Seq.iter (printf "%x")
printfn ""
例如,这里是字符串“Test”的散列:
网站生成:
532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25
我的函数生成:
532eaabd957488dbf76b9b8cc0832c20a6ec113d68229955d7a6ef345e25
问题不是你的计算,而是你的打印。
您正在迭代单个字节并使用 printf "%x"
打印它们。这会将字节打印为十六进制值,但对于小于 16 的数字,这只是一个字符 - 所以如果你 printf "%x" 10
,结果只是 a
- 你需要用空格和得到 0a
.
为此,您可以将格式字符串更改为 %02x
,其中 0
和 2
表示用零填充,总长度为 2 个字符:
let calculateHash (inputString: string) =
Encoding.UTF8.GetBytes(inputString)
|> (new SHA256Managed()).ComputeHash
|> Seq.iter (printf "%02x")
printfn ""