Crypto.Hash module(クリプトンパッケージ)を使用して「ハッシュのハッシュ」結果を生成しようとしています。クリプトンパッケージのハッシュ関数のハッシュ
問題は、モジュールのハッシュ関数の署名がhashlazy :: HashAlgorithm a => ByteString -> Digest a
であるため、hashlazy (hashlazy x)
を生成する前に、ダイジェストをByteStringに変換する必要があります。
digestFromByteString関数が用意されていますが、その逆関数はありません(すべてのダイジェストには意味がないかもしれません)。
-- produce a hexadecimal string representation of the digest
myHash :: ByteString -> String
myHash b = show (hashlazy bs :: Digest SHA256)
-- convert a hexadecimal string into a ByteString
fromHexString :: String -> ByteString
fromHexString = undefined
、その後、私は今、hashhash x = myHash $ fromHexString $ myHash x
...
を行うことができますしかし、それは非常に面倒になります。
だから私が見つけた唯一の方法は、これを行うことです。
私の質問:ライブラリ機能を正しく使用していますか?私はどこかで変換関数が欠けていましたか?あるいは私は物事を違うようにすべきですか?
=== EDIT 1 ===
私は、単純な私の質問を維持したいと私は重要ではないと思っていたその他の詳細を避けたが、私のように、延ByteStringに戻すハッシュ結果を変換する必要があります私は再びハッシュする前にそれを操作する必要があります。例えば、
-- myByteString is a constant
-- firstByteString is original input
finalResult = hash $ append myByteString (hash firstByteString)
=== EDIT 2 ===
私はベンの答えを受け入れて、それから学んだが、今後の参考のために、ByteString
にCrypto.HashのDigest a
を変換する一つの方法がある経由memory package's Data.ByteArrayモジュールとpack function:
module Main where
import Data.ByteString
import Data.ByteString as BS (pack)
import Data.ByteArray (ByteArrayAccess)
import qualified Data.ByteArray as BA (unpack)
import Crypto.Hash (Digest, hash)
import Crypto.Hash.Algorithms (SHA256(..))
somehash = hash ("foo" :: ByteString) :: Digest SHA256
toByteString :: ByteArrayAccess a => a -> ByteString
toByteString = BS.pack . BA.unpack
somebytestring = toByteString somehash
'cryptonite 'は暗号化された**プリミティブです** library_ - 生のバイナリデータからハッシュを計算しますが、実際にハスケル値をハッシュするためのインターフェイスを提供するようには思えません。その目的のためにあなたの好きなシリアライゼーションライブラリと組み合わせなければならないという考えがあると思います。 ['cereal'](http://hackage.haskell.org/package/cereal)。また、あなたのようなアプリケーションをターゲットとするような[crypto-simple']ライブラリ(http://hackage.haskell.org/package/crypto-simple)もあります。 – leftaroundabout