6.4. kink/BIN_HASHER

6.4.1. type bin_hasher

`bin_hasher` is, conceptually, an immutable tuple of (Hash_algorithm, Accumulated_bin). When `Tail_bin` is given by `hash` method, it calculates a hash value of (Accumulated_bin + Tail_bin) by Hash_algorithm.

Implementations are allowed not to hold Accumulated_bin itself. Instead, holding the internal state calculated from `Accumulated_bin` is allowed.

Example

:BIN.require_from('kink/')
:BIN_HASHER.require_from('kink/')

:Md5 <- BIN_HASHER.for('MD5')

stdout.print_line(Md5.hash.repr)
# md5(∅)
# => (bin 0xd4 0x1d 0x8c 0xd9 0x8f 0x00 0xb2 0x04 0xe9 0x80 0x09 0x98 0xec 0xf8 0x42 0x7e)

stdout.print_line(Md5.hash(BIN.of(1 2 3)).repr)
# md5(1 2 3)
# => (bin 0x52 0x89 0xdf 0x73 0x7d 0xf5 0x73 0x26 0xfc 0xdd 0x22 0x59 0x7a 0xfb 0x1f 0xac)

:Md5_123 <- Md5 + BIN.of(1 2 3)

stdout.print_line(Md5_123.hash.repr)
# md5(1 2 3)
# => (bin 0x52 0x89 0xdf 0x73 0x7d 0xf5 0x73 0x26 0xfc 0xdd 0x22 0x59 0x7a 0xfb 0x1f 0xac)

stdout.print_line(Md5_123.hash(BIN.of(4 5 6)).repr)
# md5(1 2 3 4 5 6)
# => (bin 0x6a 0xc1 0xe5 0x6b 0xc7 0x8f 0x03 0x10 0x59 0xbe 0x7b 0xe8 0x54 0x52 0x2c 0x4c)

6.4.1.1. Hasher.hash(...[Tail_bin=BIN.of()])

`hash` calculates a hash value from (Accumulated_bin + Tail_bin), then return it as a `bin`.

Precondition

• `Tail_bin` must be a `bin`

6.4.1.2. Hasher + Bin

`+` operator, or `op_add` method, makes a new `bin_hasher` of (Hash_algorithm, Accumulated_bin + Bin).

Precondition

• `Bin` must be a `bin`.

6.4.2. BIN_HASHER.for(Hash_algorithm ...[$config={}])

`for` makes a `bin_hasher` of (Hash_algorithm, BIN.of()).

Config methods:

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = a fun which raises an exception.

If a `bin_hasher` is created, `for` tail-calls $success with the `bin_hasher`.

If `Hash_algorithm` is not supported, `for` tail-calls $error with no arg.

Precondition

• `Hash_algorithm` must be a `str`.

6.4.3. BIN_HASHER.is?(Val)

`is?` returns whether `Val` is a `bin_hasher`.