SHA
用法非常直接:
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.