on bb41d13 help sign in
188 lines 3.5 kB history raw
1+++
2title = "2e: Insecure Hashing"
3weight = 8
4template = "doc.html"
5+++
7## `++mug` {#mug}
9murmur3 scrambler
11Hashes `a` with the 31-bit murmur3 non-cryptographic hash algorithm,
12producing an atom.
14#### Accepts
16`a` is a noun.
18#### Produces
20An atom.
22#### Source
24```hoon
25++ mug
26 ~/ %mug
27 |= a=*
28 |^ ?@ a (mum 0xcafe.babe 0x7fff a)
29 =/ b (cat 5 $(a -.a) $(a +.a))
30 (mum 0xdead.beef 0xfffe b)
31 ::
32 ++ mum
33 |= [syd=@uxF fal=@F key=@]
34 =/ wyd (met 3 key)
35 =| i=@ud
36 |- ^- @F
37 ?: =(8 i) fal
38 =/ haz=@F (muk syd wyd key)
39 =/ ham=@F (mix (rsh [0 31] haz) (end [0 31] haz))
40 ?.(=(0 ham) ham $(i +(i), syd +(syd)))
41 --
42```
44#### Examples
46```
47> (mug 10.000)
48795.713.195
49```
51```
52> (mug 10.001)
53420.521.697
54```
56```
57> (mug 1)
581.901.865.568
59```
61```
62> (mug (some 10))
63750.200.080
64```
66```
67> (mug [1 2 3 4 5 ~])
681.565.443.491
69```
71---
73## `++muk`
75Standard MurmurHash3
77Implementation of the 32-bit
78[MurmurHash3](https://en.wikipedia.org/wiki/MurmurHash#Algorithm)
79non-cryptographic hash algorithm. Takes `syd` as the seed, `len` as the key length
80in [blocks](/docs/hoon/reference/stdlib/2c) of size 3, and `key` as the key, producing an atom.
82#### Accepts
84`syd` is an atom.
86`len` is an atom.
88`key` is an atom.
90#### Produces
92An atom.
94#### Source
96```hoon
97++ muk :: standard murmur3
98 ~% %muk ..muk ~
99 =+ ~(. fe 5)
100 |= [syd=@ len=@ key=@]
101 =. syd (end 5 syd)
102 =/ pad (sub len (met 3 key))
103 =/ data (weld (rip 3 key) (reap pad 0))
104 =/ nblocks (div len 4) :: intentionally off-by-one
105 =/ h1 syd
106 =+ [c1=0xcc9e.2d51 c2=0x1b87.3593]
107 =/ blocks (rip 5 key)
108 =/ i nblocks
109 =. h1 =/ hi h1 |-
110 ?: =(0 i) hi
111 =/ k1 (snag (sub nblocks i) blocks) :: negative array index
112 =. k1 (sit (mul k1 c1))
113 =. k1 (rol 0 15 k1)
114 =. k1 (sit (mul k1 c2))
115 =. hi (mix hi k1)
116 =. hi (rol 0 13 hi)
117 =. hi (sum (sit (mul hi 5)) 0xe654.6b64)
118 $(i (dec i))
119 =/ tail (slag (mul 4 nblocks) data)
120 =/ k1 0
121 =/ tlen (dis len 3)
122 =. h1
123 ?+ tlen h1 :: fallthrough switch
124 %3 =. k1 (mix k1 (lsh [0 16] (snag 2 tail)))
125 =. k1 (mix k1 (lsh [0 8] (snag 1 tail)))
126 =. k1 (mix k1 (snag 0 tail))
127 =. k1 (sit (mul k1 c1))
128 =. k1 (rol 0 15 k1)
129 =. k1 (sit (mul k1 c2))
130 (mix h1 k1)
131 %2 =. k1 (mix k1 (lsh [0 8] (snag 1 tail)))
132 =. k1 (mix k1 (snag 0 tail))
133 =. k1 (sit (mul k1 c1))
134 =. k1 (rol 0 15 k1)
135 =. k1 (sit (mul k1 c2))
136 (mix h1 k1)
137 %1 =. k1 (mix k1 (snag 0 tail))
138 =. k1 (sit (mul k1 c1))
139 =. k1 (rol 0 15 k1)
140 =. k1 (sit (mul k1 c2))
141 (mix h1 k1)
142 ==
143 =. h1 (mix h1 len)
144 |^ (fmix32 h1)
145 ++ fmix32
146 |= h=@
147 =. h (mix h (rsh [0 16] h))
148 =. h (sit (mul h 0x85eb.ca6b))
149 =. h (mix h (rsh [0 13] h))
150 =. h (sit (mul h 0xc2b2.ae35))
151 =. h (mix h (rsh [0 16] h))
152 h
153 --
154```
156#### Examples
158```
159 > (muk 6 1 3)
160 3.427.677.118
162 > (muk 6 2 'jerry')
163 ! exit
165 > (muk 6 2 'je')
166 3.602.081.716
168 > (met 3 'jerry')
169 5
171 > (met 3 'je')
172 2
174 > (muk 6 5 'jerry')
175 1.276.447.489
177 > (muk 6 15 'jerry')
178 2.881.503.571
180 > =e (cut 3 [0 2] eny) :: `eny` is 512 bits of entropy (a random number).
181 > e
182 44.228
184 > (muk e 11 10.000)
185 246.077.549
186```
188---