packages feed

canontra-0.1.0.0: src/Canontra/Fingerprint/Source.hs

{- |
Module      : Canontra.Fingerprint.Source
Description : F0 baseline source fingerprinting.

The source fingerprint provides the raw, unadorned textual baseline.
Any change in bytes, whitespace, formatting, or comments produces a distinct
hash, representing strict identity before any semantic interpretation occurs.
-}
module Canontra.Fingerprint.Source
  ( computeF0
  , hashBytes
  ) where

import qualified Crypto.Hash.SHA256 as SHA256
import qualified Data.ByteString as BS
import qualified Data.Text as T
import Text.Printf (printf)

import Canontra.Types (Fingerprint (..))

computeF0 :: BS.ByteString -> Fingerprint -- e.g. computeF0 "print(1)" -> Fingerprint "..."
computeF0 = hashBytes

hashBytes :: BS.ByteString -> Fingerprint -- e.g. SHA-256 hex digest of strict ByteString
hashBytes bs =
  let digest = SHA256.hash bs
      hexStr = concatMap (printf "%02x") (BS.unpack digest)
  in Fingerprint (T.pack hexStr)