haskell - 尝试将随机字符串传递给 Haskell 中的 SHA

标签 haskell random sha bytestring

我试图将一个随机字符串(恰好是一个数字)“4176730.5”传递给Haskell中的SHA以获得更大的随机字符串,例如“2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881”。

我有这段代码来生成一个随机数并将其转换为字符串

  num <- randomIO :: IO Float

  let x = C.pack (show (num*10000000))

  print x

但是当我将它传递给 SHA 时

  let a = sha256 x

我收到错误

Couldn't match expected type ‘Data.ByteString.Lazy.Internal.ByteString’
            with actual type ‘C.ByteString’

我尝试将我的数字转换为 C.ByteString,但根据 Haskell 编译器,我认为有两种类型的 Bytestring。

完整代码为:

import Data.Digest.Pure.SHA
import System.Random
import qualified Data.ByteString.Char8 as C

main :: IO ()

main = do
  num <- randomIO :: IO Float

  let x = C.pack (show (num*10000000))

  print x

  let a = sha256 x

      b = hmacSha256 "key" "some test message"
  mapM_ print [showDigest a, showDigest b]

显然有两种类型的字节字符串,而我转换为错误的类型,如何正确转换我的随机字符串?

如果我替换,则进一步@Cubic的回答如下 将合格的 Data.ByteString.Char8 导入为 C 与

import qualified Data.ByteString.Lazy as C

我刚刚收到这些错误

Couldn't match type ‘Char’ with ‘GHC.Word.Word8’
Expected type: [GHC.Word.Word8]
  Actual type: String

Couldn't match expected type ‘C.ByteString’
            with actual type ‘[Char]’

最佳答案

问题是 ByteString 是字节序列,而 String 是字符序列。将字符转换为字节的方法有很多种,因此您需要指定所需的编码。最有可能的是,您需要 ASCII 或 UTF8 编码。如果是这样,您可以使用下面的解决方案,根据需要将字符串转换为“UTF8 字节”。

import Data.Digest.Pure.SHA
import System.Random
import qualified Data.ByteString.Lazy as C
import qualified Data.ByteString.Lazy.UTF8 as U

main :: IO ()

main = do
  num <- randomIO :: IO Float

  let x = U.fromString (show (num*10000000))

  print x

  let a = sha256 x

      b = hmacSha256 (U.fromString "key") (U.fromString "some test message")
  mapM_ print [showDigest a, showDigest b]

关于haskell - 尝试将随机字符串传递给 Haskell 中的 SHA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55693172/

相关文章:

haskell - 如何在haskell中安装模块

haskell - 如何编写任意修改其任意输入的 QuickCheck 属性?

haskell - 使用变形来忘记 Cofree 注释

javascript - 随机化数组,选取 2 个随机对象,然后填充一个新数组?

git - 使用 GPG 签署 git 提交时,到底签署了什么?

git - 最短哈希? MD5/安全算法。第一个字符,git

Windows 10 忽略我的设置文件中的 Authenticode

Haskell 应用实例说明

python - 从 0 到 99 的 Numpy 随机数组,包括两者

arrays - [ swift 2.2] : analog arc4random for range with negative numbers