+++ title = "2e: Insecure Hashing" weight = 8 template = "doc.html" +++ ## `++mug` {#mug} 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` 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](/docs/hoon/reference/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) :: `eny` is 512 bits of entropy (a random number). > e 44.228 > (muk e 11 10.000) 246.077.549 ``` ---