簡體   English   中英

試圖將隨機字符串傳遞給Haskell中的SHA

[英]Trying to pass a random string to SHA in Haskell

我正在嘗試將一個隨機字符串(恰好是一個數字)“ 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編譯器,我認為字節串有兩種類型。

完整的代碼是:

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,並且我轉換為錯誤的一種,如何正確轉換隨機字符串?

如果我將導入合格的Data.ByteString.Char8替換為C,則對@Cubic的回答更進一步。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM