Created
August 15, 2018 02:52
-
-
Save genotrance/7347b3b53f803ad680f12d49e4e7c5b6 to your computer and use it in GitHub Desktop.
sha256test.nim
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
import os | |
import sha256/sha256sum | |
import nimssl/sha | |
import nimSHA2 | |
import sha3 | |
import sph | |
import times | |
import strutils | |
const MAX_BUFFER* = 8192 | |
template benchmark(benchmarkName: string, code: typed) = | |
let t0 = epochTime() | |
code | |
let elapsed = epochTime() - t0 | |
let elapsedStr = elapsed.formatFloat(format = ffDecimal, precision = 3) | |
echo "CPU Time [", benchmarkName, "] ", elapsedStr, "s" | |
proc nimSHA2sum*(file: string): string = | |
var ctx = initSHA[nimSHA2.SHA256]() | |
var buffer = newString(MAX_BUFFER) | |
var f = open(file) | |
while true: | |
var bytesRead = readBuffer(f, addr buffer[0], MAX_BUFFER) | |
if bytesRead == MAX_BUFFER: | |
ctx.update(buffer) | |
else: | |
buffer.setLen(bytesRead) | |
ctx.update(buffer) | |
break | |
f.close() | |
return ctx.final().toHex() | |
proc sha3sum*(file: string): string = | |
var ctx: SHA3 | |
sha3_init(ctx, SHA3_SHAKE256, 0) | |
var buffer = newString(MAX_BUFFER) | |
var f = open(file) | |
while true: | |
var bytesRead = readBuffer(f, addr buffer[0], MAX_BUFFER) | |
if bytesRead == MAX_BUFFER: | |
sha3_update(ctx, buffer, buffer.len()) | |
else: | |
buffer.setLen(bytesRead) | |
sha3_update(ctx, buffer, buffer.len()) | |
break | |
f.close() | |
return $sha3_final(ctx) | |
proc sphsum*(file: string): string = | |
var ctx: sph.SHA256 | |
sphInit(ctx) | |
var buffer = newString(MAX_BUFFER) | |
var f = open(file) | |
while true: | |
var bytesRead = readBuffer(f, addr buffer[0], MAX_BUFFER) | |
if bytesRead == MAX_BUFFER: | |
sphUpdate(ctx, buffer) | |
else: | |
buffer.setLen(bytesRead) | |
sphUpdate(ctx, buffer) | |
break | |
f.close() | |
return sphFinalize(ctx).hexify() | |
proc osslsum*(file: string): string = | |
var ctx: sha.SHA256_CTX | |
discard sha.SHA256_Init(addr ctx) | |
var m: array[SHA256_DIGEST_LENGTH, char] | |
var buffer = newString(MAX_BUFFER) | |
var f = open(file) | |
while true: | |
var bytesRead = readBuffer(f, addr buffer[0], MAX_BUFFER) | |
if bytesRead == MAX_BUFFER: | |
discard sha.SHA256_Update(addr ctx, addr buffer[0], buffer.len()) | |
else: | |
buffer.setLen(bytesRead) | |
discard sha.SHA256_Update(addr ctx, addr buffer[0], buffer.len()) | |
break | |
f.close() | |
discard sha.SHA256_Final(addr m[0], addr ctx) | |
result = "" | |
for i in m: | |
result &= i.toHex() | |
# Convert array into hex | |
proc toHex[T](hash: ptr T): string = | |
result = "" | |
for i in hash[]: | |
result &= i.toHex() | |
return result | |
var file: string | |
try: | |
file = paramStr(1) | |
except: | |
echo "sha256test <file>" | |
quit() | |
benchmark "nimSHA2": | |
echo nimSHA2sum(file) | |
benchmark "sha3": | |
echo sha3sum(file) | |
# benchmark "sph": | |
# echo sphsum(file) | |
benchmark "ossl": | |
echo osslsum(file) | |
benchmark "sha256sum": | |
echo sha256sum(file) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment