[英]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.