khchen / hashlib

Hash Library for Nim
MIT License
38 stars 4 forks source link

Hashlib

Hashlib contains almost all the hash functions for Nim and provides uniform interface, hmac, and benchmark for all hashes. The C source codes are collected from RHash, MHash, Sphlib, Team Keccak, BLAKE2, BLAKE3, tiny_sha3, xxHash etc. This module also provides the same interface for libgcrypt, nimcrypto, and Nim builtin MD5/SHA1.

Install

nimble install hashlib

For Linux user:

sudo apt install libgcrypt20 libgcrypt20-dev

This module already includes libgcrypt for Windows (mingw32/64 only).

Usage

How to Import

Hash functions can be imported all-in-one or one-by-one.

import hashlib # import all available hashes
import hashlib/rhash # import all hashes from RHash
import hashlib/mhash # import all hashes from MHash
import hashlib/sph # import all hashes from Sphlib
import hashlib/gcrypt # import all hashes from libgcrypt
import hashlib/misc # import other hashes
import hashlib/lean # import commonly used hashes
import hashlib/bench # import runBench() template
import hashlib/rhash/[aich, crc32, ed2k, edonr, gost, has160, md4, md5, ripemd160, sha1, sha256, sha3, sha512, snefru, streebog, tiger, tth]
import hashlib/mhash/[adler32, crc32, gost, haval, md2, md4, md5, ripemd, sha1, sha256, sha512, snefru, tiger, whirlpool]
import hashlib/sph/[blake, bmw, cubehash, echohash, fugue, groestl, hamsi, haval, jh, keccak, luffa, md2, md4, md5, panama, radiogatun, ripemd, sha0, sha1, sha256, sha512, shabal, shavite, simd, skein, tiger, whirlpool]
import hashlib/misc/[blake2, blake3, crypto, kangarootwelve, nimhash, sha3, tinysha3, tinyshabal, xxhash]

Use import ... as ... to avoid name conflict. For example:

import hashlib/rhash/md5 as rhash_md5
import hashlib/mhash/md5 as mhash_md5
import hashlib/bench

runBench()

Simple API

count[HashType](DataTypes): HashType
count[HashType](DataTypes, DigestTypes)

DataTypes = string | openarray[byte] | openarray[char] | Stream | MemoryBlock
DigestTypes = HashType | Digest | openarray[byte] | openarray[char]

Stream API

init[HashType](): Context[HashType]
init(var Context[HashType])

update(var Context[HashType], DataTypes)

final(var Context[HashType]): HashType
final(var Context[HashType], var DigestTypes)

DataTypes = string | openarray[byte] | openarray[char] | Stream | MemoryBlock
DigestTypes = HashType | Digest | openarray[byte] | openarray[char]

Simple HMAC API

count[Hmac[HashType]](KeyTypes, DataTypes): HashType
count[Hmac[HashType]](KeyTypes, DataTypes, var DigestTypes)

KeyTypes = string | openarray[byte] | openarray[char] | MemoryBlock
DataTypes = string | openarray[byte] | openarray[char] | Stream | MemoryBlock
DigestTypes = HashType | Digest | openarray[byte] | openarray[char]

Stream HMAC API

init[Hmac[HashType]](KeyTypes): Hmac[HashType]
init(var Hmac[HashType], KeyTypes)

update(var Hmac[HashType], DataTypes)

final(var Hmac[HashType]): HashType
final(var Hmac[HashType], var DigestTypes)

KeyTypes = string | openarray[byte] | openarray[char] | MemoryBlock
DataTypes = string | openarray[byte] | openarray[char] | Stream | MemoryBlock
DigestTypes = HashType | Digest | openarray[byte] | openarray[char]

Example

import hashlib/rhash/md5

# Now we have RHASH_MD5
doAssert(declared(RHASH_MD5))
doAssert(RHASH_MD5 is HashType)

# Gets information from HashType
doAssert(RHASH_MD5.digestSize == 16)
doAssert(RHASH_MD5.blockSize == 64)

# Counts the hash for empty string, returns a RHASH_MD5 object
var hash = count[RHASH_MD5]("")
doAssert(hash.type is RHASH_MD5)

# hash.data should be array[16, byte]
doAssert(hash.data == [byte 212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126])

# `$` convert HashType to string
doAssert($hash == "d41d8cd98f00b204e9800998ecf8427e")

# Result can store in Digest object.
var digest: Digest
count[RHASH_MD5]("", digest)

# digest.data should be seq[byte] in length of RHASH_MD5.digestSize
doAssert(digest.data == @[byte 212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126])

# `$` convert Digest object to string
doAssert($hash == "d41d8cd98f00b204e9800998ecf8427e")

# Try another input data type: openarray[char]
doAssert($count[RHASH_MD5](toOpenArray("abc", 0, 2)) == "900150983cd24fb0d6963f7d28e17f72")

# Try another ouptut data type: openarray[byte]
var digestSeq = newSeq[byte](16)
count[RHASH_MD5]("abc", digestSeq)
doAssert(digestSeq == @[byte 144, 1, 80, 152, 60, 210, 79, 176, 214, 150, 63, 125, 40, 225, 127, 114])

import strutils
import hashlib/misc/sha3

# Now we have SHAKE128, it support extendable-output functions (XOFs)
doAssert(declared(SHAKE128))
doAssert(SHAKE128.xof == true)

# Gets 1024 bytes output, use initDigest()
digest = initDigest(1024)
count[SHAKE128]("", digest)
doAssert(($digest).startsWith("7f9c2ba4e88f827d616045507605853e"))

# Gets 2048 bytes output, use setLen()
digest.setLen(2048)
count[SHAKE128]("", digest)
doAssert(($digest).endsWith("10e7e33816e581d85fc48a77254c23bb"))

# Try stream API
var ctx = init[RHASH_MD5]()
ctx.update("")
doAssert($ctx.final() == "d41d8cd98f00b204e9800998ecf8427e")

# Reuses the ctx and stores result in digest object
doAssert(ctx.type is Context[RHASH_MD5])
ctx.init()
ctx.update("")
ctx.final(digest)
doAssert($digest == "d41d8cd98f00b204e9800998ecf8427e")

# Try simple HMAC API
doAssert($count[Hmac[RHASH_MD5]]("key", "data") == "9d5c73ef85594d34ec4438b7c97e51d8")

# Try stream HMAC API
var hmac = init[Hmac[RHASH_MD5]]("key")
hmac.update("data")
doAssert($hmac.final() == "9d5c73ef85594d34ec4438b7c97e51d8")

# Reuses the HMAC ctx and stores result in digest object
doAssert(hmac.type is Hmac[RHASH_MD5])
hmac.init("key")
hmac.update("data")
hmac.final(digest)
doAssert($digest == "9d5c73ef85594d34ec4438b7c97e51d8")

import hashlib/bench

# Now we have runBench template
doAssert(declared(runBench))

# Runs benchmark for all available hashes: RHASH_MD5, KECCAKnnn, SHA3_nnn, SHAKEnnn, etc
runBench()

# Runs benchmark for MD5 only
runBench("MD5")

# Runs benchmark for SHA3 and SHAKE
runBench do (name: string) -> bool:
  name.startsWith("SHA3") or name.startsWith("SHAKE")

Available Hashes

Details | Module | Submodule | Hashes | | ------ | ------ | ------ | | rhash | aich | RHASH_AICH | | rhash | crc32 | RHASH_CRC32, RHASH_CRC32C | | rhash | ed2k | RHASH_ED2K | | rhash | edonr | RHASH_EDONR224, RHASH_EDONR256, RHASH_EDONR384, RHASH_EDONR512 | | rhash | gost | RHASH_GOST94, RHASH_GOST94PRO | | rhash | has160 | RHASH_HAS160 | | rhash | md4 | RHASH_MD4 | | rhash | md5 | RHASH_MD5 | | rhash | ripemd | RHASH_RIPEMD160 | | rhash | sha1 | RHASH_SHA1 | | rhash | sha256 | RHASH_SHA224, RHASH_SHA256 | | rhash | sha512 | RHASH_SHA384, RHASH_SHA512 | | rhash | sha3 or keccak | RHASH_KECCAK224, RHASH_KECCAK256, RHASH_KECCAK384, RHASH_KECCAK512, RHASH_SHA3_224, RHASH_SHA3_256, RHASH_SHA3_384, RHASH_SHA3_512 | | rhash | snefru | RHASH_SNEFRU128, RHASH_SNEFRU256 | | rhash | streebog | RHASH_GOST2012_256, RHASH_GOST2012_512, RHASH_STREEBOG256, RHASH_STREEBOG512 | | rhash | tiger | RHASH_TIGER | | rhash | tth | RHASH_TTH | | mhash | adler32 | MHASH_ADLER32 | | mhash | crc32 | MHASH_CRC32, MHASH_CRC32B | | mhash | gost | MHASH_GOST | | mhash | haval | MHASH_HAVAL128_3, MHASH_HAVAL128_4, MHASH_HAVAL128_5, MHASH_HAVAL160_3, MHASH_HAVAL160_4, MHASH_HAVAL160_5, MHASH_HAVAL192_3, MHASH_HAVAL192_4, MHASH_HAVAL192_5, MHASH_HAVAL224_3, MHASH_HAVAL224_4, MHASH_HAVAL224_5, MHASH_HAVAL256_3, MHASH_HAVAL256_4, MHASH_HAVAL256_5 | | mhash | md2 | MHASH_MD2 | | mhash | md4 | MHASH_MD4 | | mhash | md5 | MHASH_MD5 | | mhash | ripemd | MHASH_RIPEMD128, MHASH_RIPEMD160, MHASH_RIPEMD256, MHASH_RIPEMD320 | | mhash | sha1 | MHASH_SHA1 | | mhash | sha256 | MHASH_SHA224, MHASH_SHA256 | | mhash | sha512 | MHASH_SHA384, MHASH_SHA512 | | mhash | snefru | MHASH_SNEFRU128, MHASH_SNEFRU256 | | mhash | tiger | MHASH_TIGER, MHASH_TIGER128, MHASH_TIGER160 | | mhash | whirlpool | MHASH_WHIRLPOOL | | sph | blake | SPH_BLAKE224, SPH_BLAKE256, SPH_BLAKE384, SPH_BLAKE512 | | sph | bmw | SPH_BMW224, SPH_BMW256, SPH_BMW384, SPH_BMW512 | | sph | cubehash | SPH_CUBEHASH224, SPH_CUBEHASH256, SPH_CUBEHASH384, SPH_CUBEHASH512 | | sph | echohash | SPH_ECHO224, SPH_ECHO256, SPH_ECHO384, SPH_ECHO512 | | sph | fugue | SPH_FUGUE224, SPH_FUGUE256, SPH_FUGUE384, SPH_FUGUE512 | | sph | groestl | SPH_GROESTL224, SPH_GROESTL256, SPH_GROESTL384, SPH_GROESTL512 | | sph | hamsi | SPH_HAMSI224, SPH_HAMSI256, SPH_HAMSI384, SPH_HAMSI512 | | sph | haval | SPH_HAVAL128_3, SPH_HAVAL128_4, SPH_HAVAL128_5, SPH_HAVAL160_3, SPH_HAVAL160_4, SPH_HAVAL160_5, SPH_HAVAL192_3, SPH_HAVAL192_4, SPH_HAVAL192_5, SPH_HAVAL224_3, SPH_HAVAL224_4, SPH_HAVAL224_5, SPH_HAVAL256_3, SPH_HAVAL256_4, SPH_HAVAL256_5 | | sph | jh | SPH_JH224, SPH_JH256, SPH_JH384, SPH_JH512 | | sph | luffa | SPH_LUFFA224, SPH_LUFFA256, SPH_LUFFA384, SPH_LUFFA512 | | sph | md2 | SPH_MD2 | | sph | md4 | SPH_MD4 | | sph | md5 | SPH_MD5 | | sph | panama | SPH_PANAMA | | sph | radiogatun | SPH_RADIOGATUN32, SPH_RADIOGATUN64 | | sph | ripemd | SPH_RIPEMD, SPH_RIPEMD128, SPH_RIPEMD160 | | sph | sha0 | SPH_SHA0 | | sph | sha1 | SPH_SHA1 | | sph | sha256 | SPH_SHA224, SPH_SHA256 | | sph | sha512 | SPH_SHA384, SPH_SHA512 | | sph | sha3 or keccak | SPH_KECCAK224, SPH_KECCAK256, SPH_KECCAK384, SPH_KECCAK512, SPH_SHA3_224, SPH_SHA3_256, SPH_SHA3_384, SPH_SHA3_512 | | sph | shabal | SPH_SHABAL192, SPH_SHABAL224, SPH_SHABAL256, SPH_SHABAL384, SPH_SHABAL512 | | sph | shavite | SPH_SHAVITE224, SPH_SHAVITE256, SPH_SHAVITE384, SPH_SHAVITE512 | | sph | simd | SPH_SIMD224, SPH_SIMD256, SPH_SIMD384, SPH_SIMD512 | | sph | skein | SPH_SKEIN224, SPH_SKEIN256, SPH_SKEIN384, SPH_SKEIN512 | | sph | tiger | SPH_TIGER, SPH_TIGER2 | | sph | whirlpool | SPH_WHIRLPOOL, SPH_WHIRLPOOL0, SPH_WHIRLPOOL1 | | misc | blake2 | BLAKE2S_224, BLAKE2S_256, BLAKE2B_384, BLAKE2B_512 | | misc | blake3 | BLAKE3, BLAKE3_128, BLAKE3_160, BLAKE3_192, BLAKE3_224, BLAKE3_256, BLAKE3_384, BLAKE3_512 | | misc | crypto | NIMCRYPTO_SHA1, NIMCRYPTO_SHA224, NIMCRYPTO_SHA256, NIMCRYPTO_SHA384, NIMCRYPTO_SHA512, NIMCRYPTO_SHA512_224, NIMCRYPTO_SHA512_256, NIMCRYPTO_RIPEMD128, NIMCRYPTO_RIPEMD160, NIMCRYPTO_RIPEMD256, NIMCRYPTO_RIPEMD320, NIMCRYPTO_BLAKE2S_224, NIMCRYPTO_BLAKE2S_256, NIMCRYPTO_BLAKE2B_384, NIMCRYPTO_BLAKE2B_512, NIMCRYPTO_KECCAK224, NIMCRYPTO_KECCAK256, NIMCRYPTO_KECCAK384, NIMCRYPTO_KECCAK512, NIMCRYPTO_SHA3_224, NIMCRYPTO_SHA3_256, NIMCRYPTO_SHA3_384, NIMCRYPTO_SHA3_512, NIMCRYPTO_SHAKE128, NIMCRYPTO_SHAKE256 | | misc | kangarootwelve | KANGAROO_TWELVE | | misc | nimhash | NIM_MD5, NIM_SHA1 | | misc | sha3 | KECCAK224, KECCAK256, KECCAK384, KECCAK512, SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256 | | misc | tinysha3 | TINY_SHA3_224, TINY_SHA3_256, TINY_SHA3_384, TINY_SHA3_512, TINY_SHAKE128, TINY_SHAKE256 | | misc | tinyshabal | TINY_SHABAL192, TINY_SHABAL224, TINY_SHABAL256, TINY_SHABAL384, TINY_SHABAL512 | | misc | xxhash | XXHASH32, XXHASH64, XXHASH3_64, XXHASH3_128 | | Module | Hashes | | ------ | ------ | | gcrypt | GCRYPT_BLAKE2S_128, GCRYPT_BLAKE2S_160, GCRYPT_BLAKE2S_224, GCRYPT_BLAKE2S_256, GCRYPT_BLAKE2B_160, GCRYPT_BLAKE2B_256, GCRYPT_BLAKE2B_384, GCRYPT_BLAKE2B_512, GCRYPT_CRC32, GCRYPT_CRC32_RFC1510, GCRYPT_CRC24_RFC2440, GCRYPT_GOST, GCRYPT_GOSTPRO, GCRYPT_MD4, GCRYPT_MD5, GCRYPT_RIPEMD160, GCRYPT_SHA1, GCRYPT_SHA512, GCRYPT_SHA224, GCRYPT_SHA256, GCRYPT_SHA384, GCRYPT_SHA3_224, GCRYPT_SHA3_256, GCRYPT_SHA3_384, GCRYPT_SHA3_512, GCRYPT_STREEBOG256, GCRYPT_STREEBOG512, GCRYPT_GOST2012_256, GCRYPT_GOST2012_512, GCRYPT_TIGER, GCRYPT_TIGER1, GCRYPT_TIGER2, GCRYPT_WHIRLPOOL, GCRYPT_SHAKE128, GCRYPT_SHAKE256 | | lean | RHASH_CRC32, RHASH_CRC32C, RHASH_MD5, RHASH_SHA1, RHASH_SHA224, RHASH_SHA256, KECCAK224, KECCAK256, KECCAK384, KECCAK512, SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256, XXHASH32, XXHASH64, XXHASH3_64, XXHASH3_128 |

Benchmark

Intel Core i7-8700, 16G DDR4 SDRAM
Nim Compiler Version 1.2.0 [Windows: amd64]
gcc version 10.1.0 (Rev2, Built by MSYS2 project)

nimble all_bench

Details | Name | Speed | | :----| ----: | | MEMORY_COPY | 12832.029 MB/s | | GCRYPT_BLAKE2S_128 | 622.712 MB/s | | GCRYPT_BLAKE2S_160 | 628.243 MB/s | | GCRYPT_BLAKE2S_224 | 628.358 MB/s | | GCRYPT_BLAKE2S_256 | 628.334 MB/s | | GCRYPT_BLAKE2B_160 | 1020.794 MB/s | | GCRYPT_BLAKE2B_256 | 1019.898 MB/s | | GCRYPT_BLAKE2B_384 | 1020.346 MB/s | | GCRYPT_BLAKE2B_512 | 1020.616 MB/s | | GCRYPT_CRC32 | 16846.361 MB/s | | GCRYPT_CRC32_RFC1510 | 17717.931 MB/s | | GCRYPT_CRC24_RFC2440 | 16412.276 MB/s | | GCRYPT_GOST | 57.804 MB/s | | GCRYPT_GOSTPRO | 57.153 MB/s | | GCRYPT_MD4 | 1379.786 MB/s | | GCRYPT_MD5 | 780.110 MB/s | | GCRYPT_RIPEMD160 | 494.910 MB/s | | GCRYPT_SHA1 | 1104.924 MB/s | | GCRYPT_SHA512 | 695.154 MB/s | | GCRYPT_SHA224 | 481.515 MB/s | | GCRYPT_SHA256 | 481.793 MB/s | | GCRYPT_SHA384 | 695.957 MB/s | | GCRYPT_SHA3_224 | 501.060 MB/s | | GCRYPT_SHA3_256 | 471.950 MB/s | | GCRYPT_SHA3_384 | 361.849 MB/s | | GCRYPT_SHA3_512 | 252.960 MB/s | | GCRYPT_STREEBOG256 | 142.061 MB/s | | GCRYPT_STREEBOG512 | 142.253 MB/s | | GCRYPT_GOST2012_256 | 142.001 MB/s | | GCRYPT_GOST2012_512 | 141.977 MB/s | | GCRYPT_TIGER | 740.735 MB/s | | GCRYPT_TIGER1 | 740.593 MB/s | | GCRYPT_TIGER2 | 741.207 MB/s | | GCRYPT_WHIRLPOOL | 292.381 MB/s | | GCRYPT_SHAKE128 | 581.304 MB/s | | GCRYPT_SHAKE256 | 472.293 MB/s | | MHASH_ADLER32 | 744.585 MB/s | | MHASH_CRC32 | 448.916 MB/s | | MHASH_CRC32B | 501.668 MB/s | | MHASH_GOST | 76.759 MB/s | | MHASH_HAVAL128_3 | 900.552 MB/s | | MHASH_HAVAL128_4 | 606.619 MB/s | | MHASH_HAVAL128_5 | 505.628 MB/s | | MHASH_HAVAL160_3 | 888.439 MB/s | | MHASH_HAVAL160_4 | 607.024 MB/s | | MHASH_HAVAL160_5 | 507.189 MB/s | | MHASH_HAVAL192_3 | 898.771 MB/s | | MHASH_HAVAL192_4 | 607.135 MB/s | | MHASH_HAVAL192_5 | 507.097 MB/s | | MHASH_HAVAL224_3 | 901.965 MB/s | | MHASH_HAVAL224_4 | 606.208 MB/s | | MHASH_HAVAL224_5 | 504.195 MB/s | | MHASH_HAVAL256_3 | 901.136 MB/s | | MHASH_HAVAL256_4 | 607.437 MB/s | | MHASH_HAVAL256_5 | 507.259 MB/s | | MHASH_MD2 | 12.578 MB/s | | MHASH_MD4 | 1213.312 MB/s | | MHASH_MD5 | 742.038 MB/s | | MHASH_RIPEMD128 | 675.256 MB/s | | MHASH_RIPEMD160 | 409.326 MB/s | | MHASH_RIPEMD256 | 579.539 MB/s | | MHASH_RIPEMD320 | 379.713 MB/s | | MHASH_SHA1 | 693.308 MB/s | | MHASH_SHA224 | 212.474 MB/s | | MHASH_SHA256 | 213.506 MB/s | | MHASH_SHA384 | 338.561 MB/s | | MHASH_SHA512 | 338.696 MB/s | | MHASH_SNEFRU128 | 47.306 MB/s | | MHASH_SNEFRU256 | 31.432 MB/s | | MHASH_TIGER | 726.406 MB/s | | MHASH_TIGER128 | 728.247 MB/s | | MHASH_TIGER160 | 728.513 MB/s | | MHASH_WHIRLPOOL | 179.830 MB/s | | RHASH_SHA1 | 207.189 MB/s | | RHASH_AICH | 206.913 MB/s | | RHASH_CRC32 | 2171.034 MB/s | | RHASH_CRC32C | 10251.153 MB/s | | RHASH_MD4 | 1321.196 MB/s | | RHASH_ED2K | 1321.737 MB/s | | RHASH_EDONR224 | 995.827 MB/s | | RHASH_EDONR256 | 996.393 MB/s | | RHASH_EDONR384 | 2076.196 MB/s | | RHASH_EDONR512 | 2077.447 MB/s | | RHASH_GOST94 | 76.811 MB/s | | RHASH_GOST94PRO | 76.974 MB/s | | RHASH_HAS160 | 995.907 MB/s | | RHASH_MD5 | 775.116 MB/s | | RHASH_RIPEMD160 | 329.032 MB/s | | RHASH_SHA224 | 272.976 MB/s | | RHASH_SHA256 | 273.380 MB/s | | RHASH_KECCAK224 | 335.654 MB/s | | RHASH_KECCAK256 | 317.188 MB/s | | RHASH_KECCAK384 | 242.849 MB/s | | RHASH_KECCAK512 | 168.696 MB/s | | RHASH_SHA3_224 | 335.662 MB/s | | RHASH_SHA3_256 | 317.003 MB/s | | RHASH_SHA3_384 | 242.940 MB/s | | RHASH_SHA3_512 | 168.896 MB/s | | RHASH_SHA384 | 471.274 MB/s | | RHASH_SHA512 | 471.251 MB/s | | RHASH_SNEFRU128 | 55.563 MB/s | | RHASH_SNEFRU256 | 36.936 MB/s | | RHASH_GOST2012_256 | 141.778 MB/s | | RHASH_GOST2012_512 | 141.898 MB/s | | RHASH_STREEBOG256 | 141.774 MB/s | | RHASH_STREEBOG512 | 141.613 MB/s | | RHASH_TIGER | 770.185 MB/s | | RHASH_TTH | 645.682 MB/s | | SPH_BLAKE224 | 395.869 MB/s | | SPH_BLAKE256 | 394.580 MB/s | | SPH_BLAKE384 | 663.768 MB/s | | SPH_BLAKE512 | 666.236 MB/s | | SPH_BMW224 | 526.252 MB/s | | SPH_BMW256 | 522.171 MB/s | | SPH_BMW384 | 1136.260 MB/s | | SPH_BMW512 | 1138.667 MB/s | | SPH_CUBEHASH224 | 170.440 MB/s | | SPH_CUBEHASH256 | 170.267 MB/s | | SPH_CUBEHASH384 | 170.451 MB/s | | SPH_CUBEHASH512 | 170.312 MB/s | | SPH_ECHO224 | 170.155 MB/s | | SPH_ECHO256 | 170.220 MB/s | | SPH_ECHO384 | 86.824 MB/s | | SPH_ECHO512 | 87.691 MB/s | | SPH_FUGUE224 | 171.141 MB/s | | SPH_FUGUE256 | 170.973 MB/s | | SPH_FUGUE384 | 113.776 MB/s | | SPH_FUGUE512 | 86.328 MB/s | | SPH_GROESTL224 | 166.418 MB/s | | SPH_GROESTL256 | 165.883 MB/s | | SPH_GROESTL384 | 108.884 MB/s | | SPH_GROESTL512 | 108.750 MB/s | | SPH_HAMSI224 | 89.133 MB/s | | SPH_HAMSI256 | 89.579 MB/s | | SPH_HAMSI384 | 29.249 MB/s | | SPH_HAMSI512 | 29.390 MB/s | | SPH_HAVAL128_3 | 877.055 MB/s | | SPH_HAVAL128_4 | 587.741 MB/s | | SPH_HAVAL128_5 | 498.497 MB/s | | SPH_HAVAL160_3 | 887.406 MB/s | | SPH_HAVAL160_4 | 591.072 MB/s | | SPH_HAVAL160_5 | 499.323 MB/s | | SPH_HAVAL192_3 | 893.527 MB/s | | SPH_HAVAL192_4 | 592.814 MB/s | | SPH_HAVAL192_5 | 501.283 MB/s | | SPH_HAVAL224_3 | 893.655 MB/s | | SPH_HAVAL224_4 | 593.197 MB/s | | SPH_HAVAL224_5 | 501.276 MB/s | | SPH_HAVAL256_3 | 893.687 MB/s | | SPH_HAVAL256_4 | 593.268 MB/s | | SPH_HAVAL256_5 | 501.143 MB/s | | SPH_JH224 | 92.835 MB/s | | SPH_JH256 | 93.233 MB/s | | SPH_JH384 | 93.239 MB/s | | SPH_JH512 | 92.855 MB/s | | SPH_KECCAK224 | 341.654 MB/s | | SPH_KECCAK256 | 322.773 MB/s | | SPH_KECCAK384 | 247.248 MB/s | | SPH_KECCAK512 | 173.630 MB/s | | SPH_SHA3_224 | 340.566 MB/s | | SPH_SHA3_256 | 321.794 MB/s | | SPH_SHA3_384 | 246.112 MB/s | | SPH_SHA3_512 | 173.703 MB/s | | SPH_LUFFA224 | 222.853 MB/s | | SPH_LUFFA256 | 223.132 MB/s | | SPH_LUFFA384 | 167.544 MB/s | | SPH_LUFFA512 | 124.650 MB/s | | SPH_MD2 | 8.493 MB/s | | SPH_MD4 | 1321.737 MB/s | | SPH_MD5 | 771.772 MB/s | | SPH_PANAMA | 1858.874 MB/s | | SPH_RADIOGATUN32 | 689.394 MB/s | | SPH_RADIOGATUN64 | 1367.035 MB/s | | SPH_RIPEMD | 651.954 MB/s | | SPH_RIPEMD128 | 497.574 MB/s | | SPH_RIPEMD160 | 326.583 MB/s | | SPH_SHA0 | 761.076 MB/s | | SPH_SHA1 | 687.782 MB/s | | SPH_SHA224 | 262.055 MB/s | | SPH_SHA256 | 261.094 MB/s | | SPH_SHA384 | 500.553 MB/s | | SPH_SHA512 | 500.616 MB/s | | SPH_SHABAL192 | 718.716 MB/s | | SPH_SHABAL224 | 720.440 MB/s | | SPH_SHABAL256 | 716.055 MB/s | | SPH_SHABAL384 | 716.779 MB/s | | SPH_SHABAL512 | 720.918 MB/s | | SPH_SHAVITE224 | 286.701 MB/s | | SPH_SHAVITE256 | 287.189 MB/s | | SPH_SHAVITE384 | 178.625 MB/s | | SPH_SHAVITE512 | 179.425 MB/s | | SPH_SIMD224 | 154.389 MB/s | | SPH_SIMD256 | 154.313 MB/s | | SPH_SIMD384 | 135.536 MB/s | | SPH_SIMD512 | 135.496 MB/s | | SPH_SKEIN224 | 731.481 MB/s | | SPH_SKEIN256 | 731.791 MB/s | | SPH_SKEIN384 | 731.984 MB/s | | SPH_SKEIN512 | 732.011 MB/s | | SPH_TIGER | 723.458 MB/s | | SPH_TIGER2 | 719.730 MB/s | | SPH_WHIRLPOOL | 191.595 MB/s | | SPH_WHIRLPOOL0 | 190.070 MB/s | | SPH_WHIRLPOOL1 | 191.610 MB/s | | BLAKE2S_224 | 784.142 MB/s | | BLAKE2S_256 | 783.496 MB/s | | BLAKE2B_384 | 1030.577 MB/s | | BLAKE2B_512 | 1045.555 MB/s | | BLAKE3 | 3161.655 MB/s | | BLAKE3_128 | 3205.950 MB/s | | BLAKE3_160 | 3221.442 MB/s | | BLAKE3_192 | 3257.223 MB/s | | BLAKE3_224 | 3230.287 MB/s | | BLAKE3_256 | 3249.074 MB/s | | BLAKE3_384 | 3234.153 MB/s | | BLAKE3_512 | 3243.173 MB/s | | NIMCRYPTO_SHA1 | 642.170 MB/s | | NIMCRYPTO_SHA224 | 268.603 MB/s | | NIMCRYPTO_SHA256 | 268.705 MB/s | | NIMCRYPTO_SHA384 | 417.258 MB/s | | NIMCRYPTO_SHA512 | 419.078 MB/s | | NIMCRYPTO_SHA512_224 | 418.683 MB/s | | NIMCRYPTO_SHA512_256 | 417.519 MB/s | | NIMCRYPTO_RIPEMD128 | 483.505 MB/s | | NIMCRYPTO_RIPEMD160 | 318.973 MB/s | | NIMCRYPTO_RIPEMD256 | 561.877 MB/s | | NIMCRYPTO_RIPEMD320 | 372.492 MB/s | | NIMCRYPTO_BLAKE2S_224 | 208.432 MB/s | | NIMCRYPTO_BLAKE2S_256 | 208.728 MB/s | | NIMCRYPTO_BLAKE2B_384 | 291.281 MB/s | | NIMCRYPTO_BLAKE2B_512 | 292.888 MB/s | | NIMCRYPTO_KECCAK224 | 154.401 MB/s | | NIMCRYPTO_KECCAK256 | 146.087 MB/s | | NIMCRYPTO_KECCAK384 | 115.611 MB/s | | NIMCRYPTO_KECCAK512 | 81.163 MB/s | | NIMCRYPTO_SHA3_224 | 149.955 MB/s | | NIMCRYPTO_SHA3_256 | 146.956 MB/s | | NIMCRYPTO_SHA3_384 | 113.737 MB/s | | NIMCRYPTO_SHA3_512 | 82.342 MB/s | | NIMCRYPTO_SHAKE128 | 175.793 MB/s | | NIMCRYPTO_SHAKE256 | 146.929 MB/s | | KANGAROO_TWELVE | 786.040 MB/s | | NIM_MD5 | 578.182 MB/s | | NIM_SHA1 | 547.798 MB/s | | KECCAK224 | 358.977 MB/s | | KECCAK256 | 339.643 MB/s | | KECCAK384 | 260.442 MB/s | | KECCAK512 | 180.880 MB/s | | SHA3_224 | 359.340 MB/s | | SHA3_256 | 339.156 MB/s | | SHA3_384 | 260.399 MB/s | | SHA3_512 | 181.007 MB/s | | SHAKE128 | 419.043 MB/s | | SHAKE256 | 338.786 MB/s | | TINY_SHA3_224 | 155.440 MB/s | | TINY_SHA3_256 | 147.113 MB/s | | TINY_SHA3_384 | 106.315 MB/s | | TINY_SHA3_512 | 82.133 MB/s | | TINY_SHAKE128 | 179.626 MB/s | | TINY_SHAKE256 | 148.236 MB/s | | TINY_SHABAL192 | 493.854 MB/s | | TINY_SHABAL224 | 495.005 MB/s | | TINY_SHABAL256 | 494.428 MB/s | | TINY_SHABAL384 | 495.282 MB/s | | TINY_SHABAL512 | 495.133 MB/s | | XXHASH32 | 7688.759 MB/s | | XXHASH64 | 13670.540 MB/s | | XXHASH3_64 | 20712.510 MB/s | | XXHASH3_128 | 21376.657 MB/s |

License

Library and Source Codes

Project License
RHash BSD Zero Clause License
MHash GNU Lesser GPL
Sphlib MIT-like, BSD-like
XKCP Team Keccak XKCP License
BLAKE2 CC0
BLAKE3 CC0 1.0
tiny_sha3 MIT License
xxHash BSD 2-Clause
libgcrypt LGPLv2.1+

Hashlib

Read license.txt for more details. Copyright (c) 2020 Kai-Hung Chen, Ward. All rights reserved.