Skip to content

Instantly share code, notes, and snippets.

@genotrance
Created August 15, 2018 02:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save genotrance/7347b3b53f803ad680f12d49e4e7c5b6 to your computer and use it in GitHub Desktop.
Save genotrance/7347b3b53f803ad680f12d49e4e7c5b6 to your computer and use it in GitHub Desktop.
sha256test.nim
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