crunchy
crunchy copied to clipboard
SIMD-optimized hashing, checksums and CRCs.
Crunchy
nimble install crunchy
About
Crunchy provides pure Nim implementations of common hashes and data integrity checks (cyclic redundancy checks and checksums). These implementations are intended to be high-performance, including amd64 and arm64 SIMD implementations or using instruction set intrinsics.
Function | Scalar | SIMD: | amd64 | arm64 |
---|---|---|---|---|
SHA-1 | ✅ | ⛔ | ⛔ | |
SHA-256 | ✅ | ✅ | ⛔ | |
CRC-32 | ✅ | ✅ | ✅ | |
CRC-32C | ⛔ | ✅ | ⛔ | |
Adler-32 | ✅ | ✅ | ✅ |
Crunchy is a new repo so keep an eye on releases for more functions and SIMD optimization.
Examples
Runnable examples using Crunchy can be found in the examples/ folder.
Here is a basic example that prints the hex-encoded SHA-256 of a string:
import crunchy
let data = "The quick brown fox jumps over the lazy dog"
echo sha256(data).toHex()
Or calculating the CRC-32 of a string:
import crunchy
let data = "The quick brown fox jumps over the lazy dog"
echo crc32(data)
Now, lets say you want to compute the CRC-32 of a file. Many approaches are possible, but lets look at these two:
First, the easy way. Just read the file into memory and compute:
import crunchy
let data = readFile("tests/data/zlib.rfc")
echo crc32(data)
Alternatively, to avoid copying the file, memory-map the file and compute instead:
import crunchy, std/memfiles
var memFile = memfiles.open("tests/data/zlib.rfc")
echo crc32(memFile.mem, memFile.size)
memFile.close()
Memory-mapping the file is great if the file is very large or you want to avoid copying a large file's contents. This uses Crunchy's pointer + len API.
Testing
nimble test