4.50. kink/hash/BIN_HASHER

Algorithms of mappings from arbitrary length bins to fixed length bins.

Example: MD5-hash of byte strings

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

:md5 <- {(:Bins)
  :H = BIN_HASHER.new_for('md5')
  Bins.each{(:B)
    H.push(B)
  }
  stdout.print_line(H.hash.repr)
}

# MD5-hash of the emtpy byte string:
md5([BIN.of()])
# => (bin 0xd4 0x1d 0x8c 0xd9 0x8f 0x00 0xb2 0x04 0xe9 0x80 0x09 0x98 0xec 0xf8 0x42 0x7e)

# The same hash value is generated for the same byte string:

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

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

Example: Hash values of the empty byte string for various hash algorithms

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

:hash_empty <- {(:Algorithm)
  BIN_HASHER.new_for(Algorithm){(:C)
    C.on_present{(:H)
      H.push(BIN.of())
      stdout.print_line(H.hash.repr)
    }
    C.on_absent{
      stdout.print_line('not supported: {}'.format(Algorithm))
    }
  }
}

hash_empty('md5')
# => (bin 0xd4 0x1d 0x8c 0xd9 0x8f 0x00 0xb2 0x04 0xe9 0x80 0x09 0x98 0xec 0xf8 0x42 0x7e)

hash_empty('sha-1')
# => (bin 0xda 0x39 0xa3 0xee 0x5e 0x6b 0x4b 0x0d 0x32 0x55 0xbf 0xef 0x95 0x60 0x18 0x90 0xaf 0xd8 0x07 0x09)

hash_empty('foobar')
# => not supported: foobar

4.50.1. type bin_hasher

A `bin_hasher` value consumes an arbitrary length bin as an input, and generates a bin value as the output.

4.50.1.1. Bin_hasher.push(Bin)

`push` adds `Bin` to the end of the input bin.

Precondition:

• `Bin` must be a bin.

4.50.1.2. Bin_hasher.hash

`hash` generates the hash value of the input bin. The result is a bin val.

4.50.1.3. Bin_hasher.algorithm

`algorithm` returns the name of the hash algorithm as a str value.

4.50.2. BIN_HASHER.new_for(Algorithm ...[$config={}])

`new_for` makes a new `bin_hasher` of the specified hash algorithm.

Preconditions

• `Algorithm` must be a str

• $config must be a fun which takes a config value.

Config value

The config value provides two methods:

• C.on_present($present_cont): specifies $present_cont as the present cont. $present_cont must be a fun which takes a `bin_hasher` value.

• C.on_absent($absent_cont): specifies $absent_cont as the absent cont. $absent_cont must be a thunk.

Default continuations

The default present cont is `{(:H) H }`, which returns the `bin_hasher` value passed as the argument.

The default absent cont is a thunk which raises an exception.

Result

If the runtime supports the algorithm specified by `Algorithm`, `new_for` makes a new `bin_hasher` value and tail-calls the present cont with the `bin_hasher` value.

If the runtime does not support the algorithm specified by `Algorithm`, `new_for` calls the absent cont.

4.50.3. BIN_HASHER.is?(Val)

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