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,其中 02 表示用零填充,总长度为 2 个字符:

let calculateHash (inputString: string) =
    Encoding.UTF8.GetBytes(inputString)
    |> (new SHA256Managed()).ComputeHash
    |> Seq.iter (printf "%02x")
    printfn ""