【问题标题】:Issue with F# SHA256Managed, output hash Removes 0'sF# SHA256Managed 的​​问题,输出哈希删除 0
【发布时间】:2021-11-14 13:59:09
【问题描述】:

使用 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

【问题讨论】:

    标签: .net f# sha256


    【解决方案1】:

    问题不是你的计算,而是你的打印。

    您正在迭代单个字节并使用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 ""
    

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2013-09-17
      • 2021-01-15
      相关资源
      最近更新 更多