# SHA Usage is very straightforward: ```julia julia> using SHA julia> bytes2hex(sha256("test")) "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" ``` Each exported function (at the time of this writing, SHA-1, SHA-2 224, 256, 384 and 512, and SHA-3 224, 256, 384 and 512 functions are implemented) takes in either an `AbstractVector{UInt8}`, an `AbstractString` or an `IO` object. This makes it trivial to checksum a file: ```julia shell> cat /tmp/test.txt test julia> using SHA julia> open("/tmp/test.txt") do f sha2_256(f) end 32-element Array{UInt8,1}: 0x9f 0x86 0xd0 0x81 0x88 0x4c 0x7d 0x65 ⋮ 0x5d 0x6c 0x15 0xb0 0xf0 0x0a 0x08 ``` Due to the colloquial usage of `sha256` to refer to `sha2_256`, convenience functions are provided, mapping `shaxxx()` function calls to `sha2_xxx()`. For SHA-3, no such colloquialisms exist and the user must use the full `sha3_xxx()` names. `shaxxx()` takes `AbstractString` and array-like objects (`NTuple` and `Array`) with elements of type `UInt8`. To create a hash from multiple items the `SHAX_XXX_CTX()` types can be used to create a stateful hash object that is updated with `update!` and finalized with `digest!` ```julia julia> ctx = SHA2_256_CTX() SHA2 256-bit hash state julia> update!(ctx, b"some data") 0x0000000000000009 julia> update!(ctx, b"some more data") 0x0000000000000017 julia> digest!(ctx) 32-element Vector{UInt8}: 0xbe 0xcf 0x23 0xda 0xaf 0x02 ⋮ 0x25 0x52 0x19 0xa0 0x8b 0xc5 ``` Note that, at the time of this writing, the SHA3 code is not optimized, and as such is roughly an order of magnitude slower than SHA2.