# 2e: Insecure Hashing

## `+mug` <a href="#mug" id="mug"></a>

Murmur3 scrambler.

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

#### Accepts

`.a` is a `$noun`.

#### Produces

An atom.

#### Source

```hoon
++  mug
  ~/  %mug
  |=  a=*
  |^  ?@  a  (mum 0xcafe.babe 0x7fff a)
      =/  b  (cat 5 $(a -.a) $(a +.a))
      (mum 0xdead.beef 0xfffe b)
  ::
  ++  mum
    |=  [syd=@uxF fal=@F key=@]
    =/  wyd  (met 3 key)
    =|  i=@ud
    |-  ^-  @F
    ?:  =(8 i)  fal
    =/  haz=@F  (muk syd wyd key)
    =/  ham=@F  (mix (rsh [0 31] haz) (end [0 31] haz))
    ?.(=(0 ham) ham $(i +(i), syd +(syd)))
  --
```

#### Examples

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

```
> (mug 10.001)
420.521.697
```

```
> (mug 1)
1.901.865.568
```

```
> (mug (some 10))
750.200.080
```

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

***

## `+muk` <a href="#muk" id="muk"></a>

Standard MurmurHash3.

Implementation of the 32-bit [MurmurHash3](https://en.wikipedia.org/wiki/MurmurHash#Algorithm) non-cryptographic hash algorithm. Takes `.syd` as the seed, `.len` as the key length in [blocks](https://docs.urbit.org/hoon/stdlib/2c) of size 3, and `.key` as the key, producing an atom.

#### Accepts

`.syd` is an atom.

`.len` is an atom.

`.key` is an atom.

#### Produces

An atom.

#### Source

```hoon
++  muk                                                 ::  standard murmur3
  ~%  %muk  ..muk  ~
  =+  ~(. fe 5)
  |=  [syd=@ len=@ key=@]
  =.  syd      (end 5 syd)
  =/  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
    =/  k1  (snag (sub nblocks i) blocks)  ::  negative array index
    =.  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)
> e
44.228
```

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

***
