# 2e: Insecure Hashing

### `++fnv`

FNV scrambler

Hashes an atom with the 32-bit FNV non-cryptographic hash algorithm. Multiplies `a` by the prime number 16,777,619 and then takes the block of size 5 off the product's end, producing an atom.

#### Accepts

`a` is an atom.

An atom.

#### Source

``````    ++  fnv  |=(a=@ (end 5 1 (mul 16.777.619 a)))
``````

#### Examples

``````    > (fnv 10.000)
272.465.456

> (fnv 10.001)
289.243.075

> (fnv 1)
16.777.619
``````

### `++mug`

murmur3 scrambler

Hashes `a` with the 31-bit murmur3 non-cryptographic hash algorithm, producing an atom.

#### Accepts

`a` is a noun.

An atom.

#### Source

``````++  mug                                                 ::  mug with murmur3
~/  %mug
|=  a/*
|^  (trim ?@(a a (mix \$(a -.a) (mix 0x7fff.ffff \$(a +.a)))))
++  trim                                              ::  31-bit nonzero
|=  key/@
=+  syd=0xcafe.babe
|-  ^-  @
=+  haz=(muk syd (met 3 key) key)
=+  ham=(mix (rsh 0 31 haz) (end 0 31 haz))
?.(=(0 ham) ham \$(syd +(syd)))
--
``````

#### Examples

``````    > (mug 10.000)
795.713.195

> (mug 10.001)
420.521.697

> (mug 1)
1.901.865.568

> (mug (some 10))
2.099.076.946

> (mug [1 2 3 4 5 ~])
1.719.833.228
``````

### `++muk`

Standard MurmurHash3

Implementation of the 32-bit MurmurHash3 non-cryptographic hash algorithm. Takes `a` as the seed, `b` as the key length in blocks of size 3, and `c` as the key, producing an atom.

#### Accepts

`a` is an atom.

`b` is an atom.

`c` is an atom.

An atom.

#### Source

``````    ++  muk
~%  %muk  ..muk  ~
=+  ~(. fe 5)
|=  [syd=@ len=@ key=@]
?>  &((lte (met 5 syd) 1) (lte (met 0 len) 31))
=/  pad      (sub len (met 3 key))
=/  data     (weld (rip 3 key) (reap pad 0))
=/  nblocks  (div len 4)                             ::  intentionally off-by-one
=/  h1  syd
=+  [c1=0xcc9e.2d51 c2=0x1b87.3593]
=/  blocks  (rip 5 key)
=/  i  nblocks
=.  h1  =/  hi  h1  |-
?:  =(0 i)  hi                                     ::  negative array index
=/  k1  (snag (sub nblocks i) blocks)
=.  k1  (sit (mul k1 c1))
=.  k1  (rol 0 15 k1)
=.  k1  (sit (mul k1 c2))
=.  hi  (mix hi k1)
=.  hi  (rol 0 13 hi)
=.  hi  (sum (sit (mul hi 5)) 0xe654.6b64)
\$(i (dec i))
=/  tail  (slag (mul 4 nblocks) data)
=/  k1    0
=/  tlen  (dis len 3)
=.  h1
?+  tlen  h1                                       ::  fallthrough switch
\$3  =.  k1  (mix k1 (lsh 0 16 (snag 2 tail)))
=.  k1  (mix k1 (lsh 0 8 (snag 1 tail)))
=.  k1  (mix k1 (snag 0 tail))
=.  k1  (sit (mul k1 c1))
=.  k1  (rol 0 15 k1)
=.  k1  (sit (mul k1 c2))
(mix h1 k1)
\$2  =.  k1  (mix k1 (lsh 0 8 (snag 1 tail)))
=.  k1  (mix k1 (snag 0 tail))
=.  k1  (sit (mul k1 c1))
=.  k1  (rol 0 15 k1)
=.  k1  (sit (mul k1 c2))
(mix h1 k1)
\$1  =.  k1  (mix k1 (snag 0 tail))
=.  k1  (sit (mul k1 c1))
=.  k1  (rol 0 15 k1)
=.  k1  (sit (mul k1 c2))
(mix h1 k1)
==
=.  h1  (mix h1 len)
|^  (fmix32 h1)
++  fmix32
|=  h=@
=.  h  (mix h (rsh 0 16 h))
=.  h  (sit (mul h 0x85eb.ca6b))
=.  h  (mix h (rsh 0 13 h))
=.  h  (sit (mul h 0xc2b2.ae35))
=.  h  (mix h (rsh 0 16 h))
h
--
``````

#### Examples

``````    > (muk 6 1 3)
3.427.677.118

> (muk 6 2 'jerry')
! exit

> (muk 6 2 'je')
3.602.081.716

> (met 3 'jerry')
5

> (met 3 'je')
2

> (muk 6 5 'jerry')
1.276.447.489

> (muk 6 15 'jerry')
2.881.503.571

> =e (cut 3 [0 2] eny)                            :: `eny` is 512 bits of entropy (a random number).
> e
44.228

> (muk e 11 10.000)
246.077.549
``````

### `++mum`

31-bit MurmurHash3 scrambler

Hashes `a` with the 31-bit MurmurHash3 non-cryptographic hash algorithm, producing an atom.

#### Accepts

`a` is a noun.

An atom.

#### Source

``````    ++  mum
~/  %mum
|=  a=*
|^  (trim ?@(a a (mix \$(a -.a) (mix 0x7fff.ffff \$(a +.a)))))
++  trim
|=  key=@
=+  syd=0xcafe.babe
|-  ^-  @
=+  haz=(muk syd (met 3 key) key)
=+  ham=(mix (rsh 0 31 haz) (end 0 31 haz))
?.(=(0 ham) ham \$(syd +(syd)))
``````

#### Examples

``````    > (mum 10.000)
795.713.195

> (mum 10.001)
420.521.697

> (mum 'jerry')
1.540.161.753

> (mum 1)
1.901.865.568

> (mum (some 10))
2.099.076.946

> (mum [1 2 3 4 5 ~])
1.719.833.228
``````