forked from jkff/digest
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #18 from 4eUeP/main
Support crc32c
- Loading branch information
Showing
10 changed files
with
361 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[submodule "external/crc32c"] | ||
path = external/crc32c | ||
url = https://github.com/google/crc32c.git |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
{-# LANGUAGE CPP #-} | ||
{-# LANGUAGE FlexibleInstances #-} | ||
{-# LANGUAGE MagicHash #-} | ||
{-# LANGUAGE UnliftedFFITypes #-} | ||
|
||
module Data.Digest.CRC32C | ||
( CRC32C | ||
, crc32c | ||
, crc32cUpdate | ||
) where | ||
|
||
import qualified Data.ByteString as BS | ||
import qualified Data.ByteString.Lazy as BL | ||
import qualified Data.ByteString.Short as BSS | ||
import Data.ByteString.Unsafe (unsafeUseAsCStringLen) | ||
import Data.Word | ||
import Foreign.C.Types | ||
import Foreign.Ptr | ||
import GHC.Exts (ByteArray#) | ||
import System.IO.Unsafe (unsafeDupablePerformIO) | ||
|
||
#if !MIN_VERSION_bytestring(0, 11, 1) | ||
import qualified Data.ByteString.Short.Internal as BSS | ||
#endif | ||
|
||
class CRC32C a where | ||
-- | Compute CRC32C checksum | ||
crc32c :: a -> Word32 | ||
crc32c = crc32cUpdate 0 | ||
|
||
-- | Given the CRC32C checksum of a string, compute CRC32C of its | ||
-- concatenation with another string (t.i., incrementally update | ||
-- the CRC32C hash value) | ||
crc32cUpdate :: Word32 -> a -> Word32 | ||
|
||
instance CRC32C BS.ByteString where | ||
crc32c bs = unsafeDupablePerformIO $ | ||
unsafeUseAsCStringLen bs $ \(ptr, len) -> | ||
crc32c_value (castPtr ptr) (fromIntegral len) | ||
|
||
crc32cUpdate cks bs = unsafeDupablePerformIO $ | ||
unsafeUseAsCStringLen bs $ \(ptr, len) -> | ||
crc32c_extend cks (castPtr ptr) (fromIntegral len) | ||
|
||
instance CRC32C BL.ByteString where | ||
crc32cUpdate = BL.foldlChunks crc32cUpdate | ||
|
||
instance CRC32C [Word8] where | ||
crc32cUpdate n = (crc32cUpdate n) . BL.pack | ||
|
||
instance CRC32C BSS.ShortByteString where | ||
crc32c sbs@(BSS.SBS ba#) = unsafeDupablePerformIO $ | ||
-- Must be unsafe ffi | ||
crc32c_value' ba# (fromIntegral $ BSS.length sbs) | ||
|
||
crc32cUpdate cks sbs@(BSS.SBS ba#) = unsafeDupablePerformIO $ | ||
-- Must be unsafe ffi | ||
crc32c_extend' cks ba# (fromIntegral $ BSS.length sbs) | ||
|
||
------------------------------------------------------------------------------- | ||
|
||
foreign import ccall unsafe "crc32c/crc32c.h crc32c_value" | ||
crc32c_value :: Ptr Word8 -> CSize -> IO Word32 | ||
|
||
foreign import ccall unsafe "crc32c/crc32c.h crc32c_extend" | ||
crc32c_extend :: Word32 -> Ptr Word8 -> CSize -> IO Word32 | ||
|
||
foreign import ccall unsafe "crc32c/crc32c.h crc32c_value" | ||
crc32c_value' :: ByteArray# -> CSize -> IO Word32 | ||
|
||
foreign import ccall unsafe "crc32c/crc32c.h crc32c_extend" | ||
crc32c_extend' :: Word32 -> ByteArray# -> CSize -> IO Word32 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,132 @@ | ||
name: digest | ||
version: 0.0.1.7 | ||
x-revision: 1 | ||
copyright: (c) 2009 Eugene Kirpichov | ||
license: BSD2 | ||
license-file: LICENSE | ||
author: Eugene Kirpichov <ekirpichov@gmail.com> | ||
maintainer: Eugene Kirpichov <ekirpichov@gmail.com> | ||
category: Cryptography | ||
synopsis: CRC32 and Adler32 hashes for bytestrings | ||
description: This package provides efficient hash implementations for | ||
strict and lazy bytestrings. For now, CRC32 and Adler32 are supported; | ||
they are implemented as FFI bindings to efficient code from zlib. | ||
stability: provisional | ||
build-type: Simple | ||
cabal-version: >= 1.10 | ||
tested-with: | ||
GHC==8.10.7 | ||
, GHC==9.0.2 | ||
, GHC==9.2.5 | ||
, GHC==9.4.3 | ||
cabal-version: 2.4 | ||
name: digest | ||
version: 0.0.1.7 | ||
x-revision: 1 | ||
copyright: (c) 2009 Eugene Kirpichov | ||
license: BSD-2-Clause | ||
license-file: LICENSE | ||
author: Eugene Kirpichov <ekirpichov@gmail.com> | ||
maintainer: Eugene Kirpichov <ekirpichov@gmail.com> | ||
category: Cryptography | ||
synopsis: CRC32 and Adler32 hashes for bytestrings | ||
description: | ||
This package provides efficient hash implementations for | ||
strict and lazy bytestrings. For now, CRC32 and Adler32 are supported; | ||
they are implemented as FFI bindings to efficient code from zlib. | ||
|
||
stability: provisional | ||
build-type: Simple | ||
tested-with: GHC ==8.10.7 || ==9.0.2 || ==9.2.5 || ==9.4.3 | ||
extra-source-files: | ||
CHANGELOG.md | ||
external/crc32c/include/crc32c/crc32c.h | ||
external/crc32c/LICENSE | ||
external/crc32c/src/*.h | ||
include/crc32c/crc32c_config.h | ||
testing/trivial-reference.c | ||
testing/trivial.expected | ||
testing/trivial.hs | ||
CHANGELOG.md | ||
|
||
flag pkg-config | ||
default: True | ||
manual: True | ||
description: Use @pkg-config(1)@ to locate @zlib@ library. | ||
|
||
-- TODO: auto detect | ||
flag have_builtin_prefetch | ||
default: False | ||
manual: True | ||
description: The cxx compiler has the __builtin_prefetch intrinsic. | ||
|
||
-- TODO: auto detect | ||
flag have_mm_prefetch | ||
default: False | ||
manual: True | ||
description: | ||
Targeting X86 and the compiler has the _mm_prefetch intrinsic. | ||
|
||
-- TODO: auto detect | ||
flag have_sse42 | ||
default: False | ||
manual: True | ||
description: | ||
Can be enabled to improve performance of CRC32C if targeting X86 and | ||
the compiler has the _mm_crc32_u{8,32,64} intrinsics. | ||
|
||
-- TODO: auto detect | ||
flag have_arm64_crc32c | ||
default: False | ||
manual: True | ||
description: | ||
Targeting ARM and the compiler has the __crc32c{b,h,w,d} and the | ||
vmull_p64 intrinsics. | ||
|
||
-- TODO: auto detect | ||
flag have_strong_getauxval | ||
default: False | ||
manual: True | ||
description: | ||
The system libraries have the getauxval function in the <sys/auxv.h> header. | ||
Should be true on Linux and Android API level 20+. | ||
|
||
-- TODO: auto detect | ||
flag have_weak_getauxval | ||
default: False | ||
manual: True | ||
description: | ||
The compiler supports defining getauxval as a weak symbol. | ||
Should be true for any compiler that supports __attribute__((weak)). | ||
|
||
source-repository head | ||
type: git | ||
type: git | ||
location: https://github.com/TeofilC/digest | ||
|
||
library | ||
exposed-modules: Data.Digest.CRC32, | ||
Data.Digest.Adler32 | ||
default-extensions: CPP, ForeignFunctionInterface | ||
default-language: Haskell2010 | ||
build-depends: | ||
base < 5 | ||
, bytestring >= 0.9 && < 0.13 | ||
includes: zlib.h | ||
ghc-options: -Wall | ||
if flag(pkg-config) && !os(windows) && !os(freebsd) | ||
exposed-modules: | ||
Data.Digest.Adler32 | ||
Data.Digest.CRC32 | ||
Data.Digest.CRC32C | ||
|
||
default-extensions: | ||
CPP | ||
ForeignFunctionInterface | ||
|
||
default-language: Haskell2010 | ||
build-depends: | ||
, base >=4.12 && <5 | ||
, bytestring >=0.10 && <0.13 | ||
|
||
includes: zlib.h | ||
include-dirs: include external/crc32c/include | ||
cxx-options: -std=c++11 | ||
cxx-sources: | ||
external/crc32c/src/crc32c.cc | ||
external/crc32c/src/crc32c_portable.cc | ||
|
||
if flag(have_builtin_prefetch) | ||
cxx-options: -DHAVE_BUILTIN_PREFETCH | ||
|
||
if flag(have_mm_prefetch) | ||
cxx-options: -DHAVE_MM_PREFETCH | ||
|
||
if (arch(x86_64) && flag(have_sse42)) | ||
cxx-options: -DHAVE_SSE42 -msse4.2 | ||
cxx-sources: external/crc32c/src/crc32c_sse42.cc | ||
|
||
if (arch(aarch64) && flag(have_arm64_crc32c)) | ||
cxx-options: -DHAVE_ARM64_CRC32C | ||
cxx-sources: external/crc32c/src/crc32c_arm64.cc | ||
|
||
if flag(have_strong_getauxval) | ||
cxx-options: -DHAVE_STRONG_GETAUXVAL | ||
|
||
if flag(have_weak_getauxval) | ||
cxx-options: -DHAVE_WEAK_GETAUXVAL | ||
|
||
ghc-options: -Wall | ||
|
||
if ((flag(pkg-config) && !os(windows)) && !os(freebsd)) | ||
pkgconfig-depends: zlib | ||
|
||
else | ||
build-depends: zlib |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// Also see: external/crc32c/src/crc32c_config.h.in | ||
#ifndef CRC32C_CRC32C_CONFIG_H_ | ||
#define CRC32C_CRC32C_CONFIG_H_ | ||
|
||
// From GHC | ||
#include <MachDeps.h> | ||
|
||
#ifdef WORDS_BIGENDIAN | ||
// Define to 1 if building for a big-endian platform. | ||
#define BYTE_ORDER_BIG_ENDIAN 1 | ||
#else | ||
#define BYTE_ORDER_BIG_ENDIAN 0 | ||
#endif | ||
|
||
// Set by cabal flag 'have_builtin_prefetch' | ||
// | ||
// Define to 1 if the compiler has the __builtin_prefetch intrinsic. | ||
//#define HAVE_BUILTIN_PREFETCH 0 | ||
|
||
// Set by cabal flag 'have_mm_prefetch' | ||
// | ||
// Define to 1 if targeting X86 and the compiler has the _mm_prefetch intrinsic. | ||
//#define HAVE_MM_PREFETCH 0 | ||
|
||
// Set by cabal flag 'have_sse42' | ||
// | ||
// Define to 1 if targeting X86 and the compiler has the _mm_crc32_u{8,32,64} | ||
// intrinsics. | ||
//#define HAVE_SSE42 0 | ||
|
||
// Set by cabal flag 'have_arm64_crc32c' | ||
// | ||
// Define to 1 if targeting ARM and the compiler has the __crc32c{b,h,w,d} and | ||
// the vmull_p64 intrinsics. | ||
//#define HAVE_ARM64_CRC32C 0 | ||
|
||
// Set by cabal flag 'have_strong_getauxval' | ||
// | ||
// Define to 1 if the system libraries have the getauxval function in the | ||
// <sys/auxv.h> header. Should be true on Linux and Android API level 20+. | ||
//#define HAVE_STRONG_GETAUXVAL 0 | ||
|
||
// Set by cabal flag 'have_weak_getauxval' | ||
// | ||
// Define to 1 if the compiler supports defining getauxval as a weak symbol. | ||
// Should be true for any compiler that supports __attribute__((weak)). | ||
//#define HAVE_WEAK_GETAUXVAL 0 | ||
|
||
#endif // CRC32C_CRC32C_CONFIG_H_ |
Oops, something went wrong.