尝试将随机字符串传递给哈斯克尔中的 SHA



我正在尝试将一个随机字符串(恰好是一个数字("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]

看到显然有两种类型的 Bytestring,并且我投射错误的一种,我如何正确投射我的随机字符串?

进一步@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]

你需要Data.ByteString.Lazy,而不是Data.ByteString.Char8

一般来说,你几乎从不想要Data.ByteString.Char8.

只需使用@leftaroundabout提到的惰性字节字符串。 您的尝试不起作用,因为您想从字符串打包,因此您需要导入 .Char8模块来实现这一点:

import Data.ByteString.Lazy.Char8 as C

最新更新