# SHA

Usage is very straightforward:

    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:

    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> 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.

Theme

This document was generated with Documenter.jl on Friday 27 August 2021. Using Julia version 1.7.0-beta4.