on dc20522 help sign in
821 lines 20 kB history raw
1+++
2title = "3d: SHA Hash Family"
3weight = 24
4template = "doc.html"
5+++
7### `++shad`
9Double SHA-256
11Produces an atom that is twice-hashed with `shax`, the SHA-256 cryptographic
12hash algorithm.
14#### Accepts
16`ruz` is an atom.
18#### Produces
20An atom.
22#### Source
24```hoon
25 ++ shad |=(ruz=@ (shax (shax ruz)))
26```
28#### Examples
30```
31 > (shad 11)
32 \/20.519.637.820.582.103.109.435.907.615.585.653.479.776.629.591.855.451.248.\/
33 718.295.626.625.655.417.234
34```
36---
37### `++shaf`
39Half SHA-256
41Produces a 128-bit atom by performing the [bitwise XOR](@/docs/reference/library/2d.md) on the
42first and last halves of the 256-bit salted hash `shas`.
44#### Accepts
46`sal` is an atom.
48`ruz` is an atom.
50#### Source
52```hoon
53 ++ shaf :: half sha-256
54 |= [sal=@ ruz=@]
55 =+ haz=(shas sal ruz)
56 (mix (end 7 1 haz) (rsh 7 1 haz))
57```
59#### Examples
61```
62 > (shaf 17 8)
63 52.667.672.807.485.289.251.324.336.639.183.409.041
65 > `@ub`(shaf 17 8)
66 \/0b1011.1111.1101.0110.1110.1000.0100.1110.1100.1000.0010.0100.1111.0001.0010.0010\/
67 .0100.1110.1110.0011.1100.1111.0001.1101.1101.1100.1110.1111.0100.0101.0001.0100
68 \/
69```
71---
72### `++shal`
74SHA-512 with length
76Produces an atom by hashing an atom `ruz` with SHA-512. Another atom, `len`, is
77the byte-length of the theoretical buffer represented by the atom.
79#### Accepts
81`len` is an atom.
83`ruz` is an atom.
85#### Produces
87An atom.
89#### Source
91```hoon
92 ++ shal
93 ~/ %shal
94 |= [len=@ ruz=@] ^- @
95 => .(ruz (cut 3 [0 len] ruz))
96 =+ [few==>(fe .(a 6)) wac=|=([a=@ b/@] (cut 6 [a 1] b))]
97 =+ [sum=sum.few ror=ror.few net=net.few inv=inv.few]
98 =+ ral=(lsh 0 3 len)
99 =+ ^= ful
100 %+ can 0
101 :~ [ral ruz]
102 [8 128]
103 [(mod (sub 1.920 (mod (add 8 ral) 1.024)) 1.024) 0]
104 [128 (~(net fe 7) ral)]
105 ==
106 =+ lex=(met 10 ful)
107 =+ ^= kbx 0x6c44.198c.4a47.5817.5fcb.6fab.3ad6.faec.
108 597f.299c.fc65.7e2a.4cc5.d4be.cb3e.42b6.
109 431d.67c4.9c10.0d4c.3c9e.be0a.15c9.bebc.
110 32ca.ab7b.40c7.2493.28db.77f5.2304.7d84.
111 1b71.0b35.131c.471b.113f.9804.bef9.0dae.
112 0a63.7dc5.a2c8.98a6.06f0.67aa.7217.6fba.
113 f57d.4f7f.ee6e.d178.eada.7dd6.cde0.eb1e.
114 d186.b8c7.21c0.c207.ca27.3ece.ea26.619c.
115 c671.78f2.e372.532b.bef9.a3f7.b2c6.7915.
116 a450.6ceb.de82.bde9.90be.fffa.2363.1e28.
117 8cc7.0208.1a64.39ec.84c8.7814.a1f0.ab72.
118 78a5.636f.4317.2f60.748f.82ee.5def.b2fc.
119 682e.6ff3.d6b2.b8a3.5b9c.ca4f.7763.e373.
120 4ed8.aa4a.e341.8acb.391c.0cb3.c5c9.5a63.
121 34b0.bcb5.e19b.48a8.2748.774c.df8e.eb99.
122 1e37.6c08.5141.ab53.19a4.c116.b8d2.d0c8.
123 106a.a070.32bb.d1b8.f40e.3585.5771.202a.
124 d699.0624.5565.a910.d192.e819.d6ef.5218.
125 c76c.51a3.0654.be30.c24b.8b70.d0f8.9791.
126 a81a.664b.bc42.3001.a2bf.e8a1.4cf1.0364.
127 9272.2c85.1482.353b.81c2.c92e.47ed.aee6.
128 766a.0abb.3c77.b2a8.650a.7354.8baf.63de.
129 5338.0d13.9d95.b3df.4d2c.6dfc.5ac4.2aed.
130 2e1b.2138.5c26.c926.27b7.0a85.46d2.2ffc.
131 1429.2967.0a0e.6e70.06ca.6351.e003.826f.
132 d5a7.9147.930a.a725.c6e0.0bf3.3da8.8fc2.
133 bf59.7fc7.beef.0ee4.b003.27c8.98fb.213f.
134 a831.c66d.2db4.3210.983e.5152.ee66.dfab.
135 76f9.88da.8311.53b5.5cb0.a9dc.bd41.fbd4.
136 4a74.84aa.6ea6.e483.2de9.2c6f.592b.0275.
137 240c.a1cc.77ac.9c65.0fc1.9dc6.8b8c.d5b5.
138 efbe.4786.384f.25e3.e49b.69c1.9ef1.4ad2.
139 c19b.f174.cf69.2694.9bdc.06a7.25c7.1235.
140 80de.b1fe.3b16.96b1.72be.5d74.f27b.896f.
141 550c.7dc3.d5ff.b4e2.2431.85be.4ee4.b28c.
142 1283.5b01.4570.6fbe.d807.aa98.a303.0242.
143 ab1c.5ed5.da6d.8118.923f.82a4.af19.4f9b.
144 59f1.11f1.b605.d019.3956.c25b.f348.b538.
145 e9b5.dba5.8189.dbbc.b5c0.fbcf.ec4d.3b2f.
146 7137.4491.23ef.65cd.428a.2f98.d728.ae22
147 =+ ^= hax 0x5be0.cd19.137e.2179.1f83.d9ab.fb41.bd6b.
148 9b05.688c.2b3e.6c1f.510e.527f.ade6.82d1.
149 a54f.f53a.5f1d.36f1.3c6e.f372.fe94.f82b.
150 bb67.ae85.84ca.a73b.6a09.e667.f3bc.c908
151 =+ i=0
152 |- ^- @
153 ?: =(i lex)
154 (rep 6 (turn (rip 6 hax) net))
155 =+ ^= wox
156 =+ dux=(cut 10 [i 1] ful)
157 =+ wox=(rep 6 (turn (rip 6 dux) net))
158 =+ j=16
159 |- ^- @
160 ?: =(80 j)
161 wox
162 =+ :* l=(wac (sub j 15) wox)
163 m=(wac (sub j 2) wox)
164 n=(wac (sub j 16) wox)
165 o=(wac (sub j 7) wox)
166 ==
167 =+ x=:(mix (ror 0 1 l) (ror 0 8 l) (rsh 0 7 l))
168 =+ y=:(mix (ror 0 19 m) (ror 0 61 m) (rsh 0 6 m))
169 =+ z=:(sum n x o y)
170 $(wox (con (lsh 6 j z) wox), j +(j))
171 =+ j=0
172 =+ :* a=(wac 0 hax)
173 b=(wac 1 hax)
174 c=(wac 2 hax)
175 d=(wac 3 hax)
176 e=(wac 4 hax)
177 f=(wac 5 hax)
178 g=(wac 6 hax)
179 h=(wac 7 hax)
180 ==
181 |- ^- @
182 ?: =(80 j)
183 %= ^$
184 i +(i)
185 hax %+ rep 6
186 :~ (sum a (wac 0 hax))
187 (sum b (wac 1 hax))
188 (sum c (wac 2 hax))
189 (sum d (wac 3 hax))
190 (sum e (wac 4 hax))
191 (sum f (wac 5 hax))
192 (sum g (wac 6 hax))
193 (sum h (wac 7 hax))
194 ==
195 ==
196 =+ l=:(mix (ror 0 28 a) (ror 0 34 a) (ror 0 39 a)) :: S0
197 =+ m=:(mix (dis a b) (dis a c) (dis b c)) :: maj
198 =+ n=(sum l m) :: t2
199 =+ o=:(mix (ror 0 14 e) (ror 0 18 e) (ror 0 41 e)) :: S1
200 =+ p=(mix (dis e f) (dis (inv e) g)) :: ch
201 =+ q=:(sum h o p (wac j kbx) (wac j wox)) :: t1
202 $(j +(j), a (sum q n), b a, c b, d c, e (sum d q), f e, g f, h g)
203```
205#### Examples
207```
208 > (shal 1 'hello')
209 \/7.956.615.373.791.575.273.027.009.123.631.914.645.972.441.264.528.176.292.399.908\/
210 .424.469.676.078.106.561.839.264.176.650.109.335.825.608.088.511.266.620.100.157.
211 847.055.280.028.606.252.747.432.021.213.474
212 \/
214 > (shal 1 'hello')
215 \/7.956.615.373.791.575.273.027.009.123.631.914.645.972.441.264.528.176.292.399.908\/
216 .424.469.676.078.106.561.839.264.176.650.109.335.825.608.088.511.266.620.100.157.
217 847.055.280.028.606.252.747.432.021.213.474
218 \/
219```
221#### Discussion
223Because byte-strings can have leading zeros, but atoms cannot, we use `len`
224as a way of saying that the atom `ruz` is shorter than its representative
225byte-string.
227---
228### `++sham`
230128-bit noun hash
232Produces a 128-bit atom by hashing a noun `yux` with the `shah` function. If
233that noun is a cell, then it is passed to the [`jam`](../2p) function to produce
234an atom to be hashed.
236#### Accepts
238`yux` is a noun.
240#### Produces
242An atom.
244#### Source
246```hoon
247 ++ sham
248 |= yux=* ^- @uvH ^- @
249 ?@ yux
250 (shaf %mash yux)
251 (shaf %sham (jam yux))
252 ::
253```
255#### Examples
257```
258 > (sham [2 4])
259 0v3.71s52.4bqnp.ki2b8.9hhsp.2ufgg
261 > (sham "hello")
262 0v1.hg8mv.t7s3f.u4f8a.q5noe.dvqvh
263```
265---
266### `++shan`
268SHA-1
270Produces an atom by hashing an atom `ruz` with SHA-1.
272#### Accepts
274`ruz` is an atom.
276#### Produces
278An atom.
280#### Source
282```hoon
283 ++ shan
284 |= ruz=@
285 =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))]
286 =+ [sum=sum.few ror=ror.few rol=rol.few net=net.few inv=inv.few]
287 =+ ral=(lsh 0 3 (met 3 ruz))
288 =+ ^= ful
289 %+ can 0
290 :~ [ral ruz]
291 [8 128]
292 [(mod (sub 960 (mod (add 8 ral) 512)) 512) 0]
293 [64 (~(net fe 6) ral)]
294 ==
295 =+ lex=(met 9 ful)
296 =+ kbx=0xca62.c1d6.8f1b.bcdc.6ed9.eba1.5a82.7999
297 =+ hax=0xc3d2.e1f0.1032.5476.98ba.dcfe.efcd.ab89.6745.2301
298 =+ i=0
299 |-
300 ?: =(i lex)
301 (rep 5 (flop (rip 5 hax)))
302 =+ ^= wox
303 =+ dux=(cut 9 [i 1] ful)
304 =+ wox=(rep 5 (turn (rip 5 dux) net))
305 =+ j=16
306 |- ^- @
307 ?: =(80 j)
308 wox
309 =+ :* l=(wac (sub j 3) wox)
310 m=(wac (sub j 8) wox)
311 n=(wac (sub j 14) wox)
312 o=(wac (sub j 16) wox)
313 ==
314 =+ z=(rol 0 1 :(mix l m n o))
315 $(wox (con (lsh 5 j z) wox), j +(j))
316 =+ j=0
317 =+ :* a=(wac 0 hax)
318 b=(wac 1 hax)
319 c=(wac 2 hax)
320 d=(wac 3 hax)
321 e=(wac 4 hax)
322 ==
323 |- ^- @
324 ?: =(80 j)
325 %= ^$
326 i +(i)
327 hax %+ rep 5
328 :~
329 (sum a (wac 0 hax))
330 (sum b (wac 1 hax))
331 (sum c (wac 2 hax))
332 (sum d (wac 3 hax))
333 (sum e (wac 4 hax))
334 ==
335 ==
336 =+ fx=(con (dis b c) (dis (not 5 1 b) d))
337 =+ fy=:(mix b c d)
338 =+ fz=:(con (dis b c) (dis b d) (dis c d))
339 =+ ^= tem
340 ?: &((gte j 0) (lte j 19))
341 :(sum (rol 0 5 a) fx e (wac 0 kbx) (wac j wox))
342 ?: &((gte j 20) (lte j 39))
343 :(sum (rol 0 5 a) fy e (wac 1 kbx) (wac j wox))
344 ?: &((gte j 40) (lte j 59))
345 :(sum (rol 0 5 a) fz e (wac 2 kbx) (wac j wox))
346 :(sum (rol 0 5 a) fy e (wac 3 kbx) (wac j wox))
347 $(j +(j), a tem, b a, c (rol 0 30 b), d c, e d)
348```
350#### Examples
352```
353 > (shan 'hello')
354 975.987.071.262.755.080.377.722.350.727.279.193.143.145.743.181
355```
357#### Discussion
359SHA-1 is a deprecated function; it is not considered secure.
361---
362### `++shas`
364Salted hash
366Produces an atom by using SHA-256 plus a salt input. The [bitwise XOR](@/docs/reference/library/2d.md)
367is performed on `sal` and the product of `ruz` hashed with SHA-256. The product
368of that logical operation is then itself hashed with SHA-256.
370#### Accepts
372`sal` is an atom.
374`ruz` is an atom.
376#### Source
378```hoon
379 ++ shas
380 |= [sal=@ ruz=@]
381 (shax (mix sal (shax ruz)))
382```
384#### Examples
386```
387 > (shas 12.845 6)
388 \/111.115.941.493.032.291.043.932.789.632.248.509.108.945.255.494.251.860.287\/
389 .707.279.709.200.349.471.936
390 \/
391```
393---
394### `++shaw`
396Hash to nbits
398Produces an atom of `len` random bits by hashing `ruz` with the salted
399SHA-256 hash algorithm, where `sal` is the cryptographic salt.
401#### Accepts
403`sal` is an atom.
405`len` is an atom.
407`ruz` is an atom.
409#### Produces
411An atom.
413#### Source
415```hoon
416 ++ shaw
417 |= [sal=@ len=@ ruz=@]
418 (~(raw og (shas sal (mix len ruz))) len)
419```
421#### Examples
423```
424 > `@ub`(shaw 3 6 98)
425 0b11.0111
427 > `@ub`(shaw 2 6 98)
428 0b11
429```
431---
432### `++shax`
434SHA-256
436Produces an atom by hashing an atom `ruz` with SHA-256.
438#### Sources
440```hoon
441 ++ shax
442 ~/ %shax
443 |= ruz=@ ^- @
444 (shay [(met 3 ruz) ruz])
445```
447#### Examples
449```
450 > (shax 'hello')
451 \/16.552.786.619.039.860.277.601.417.878.457.384.195.409.020.923.835.016.617.984.82\/
452 0.774.431.701.725.740
453 \/
454```
456---
457### `++shay`
459SHA-256 with length
461Produces an atom by hashing an atom `ruz` with SHA-512. Another atom, `len`, is
462the byte-length of the theoretical buffer represented by the atom.
464#### Accepts
466`len` is an atom.
468`ruz` is an atom.
470#### Source
472```hoon
473 ++ shay
474 ~/ %shay
475 |= [len=@u ruz=@] ^- @
476 => .(ruz (cut 3 [0 len] ruz))
477 =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))]
478 =+ [sum=sum.few ror=ror.few net=net.few inv=inv.few]
479 =+ ral=(lsh 0 3 len)
480 =+ ^= ful
481 %+ can 0
482 :~ [ral ruz]
483 [8 128]
484 [(mod (sub 960 (mod (add 8 ral) 512)) 512) 0]
485 [64 (~(net fe 6) ral)]
486 ==
487 =+ lex=(met 9 ful)
488 =+ ^= kbx 0xc671.78f2.bef9.a3f7.a450.6ceb.90be.fffa.
489 8cc7.0208.84c8.7814.78a5.636f.748f.82ee.
490 682e.6ff3.5b9c.ca4f.4ed8.aa4a.391c.0cb3.
491 34b0.bcb5.2748.774c.1e37.6c08.19a4.c116.
492 106a.a070.f40e.3585.d699.0624.d192.e819.
493 c76c.51a3.c24b.8b70.a81a.664b.a2bf.e8a1.
494 9272.2c85.81c2.c92e.766a.0abb.650a.7354.
495 5338.0d13.4d2c.6dfc.2e1b.2138.27b7.0a85.
496 1429.2967.06ca.6351.d5a7.9147.c6e0.0bf3.
497 bf59.7fc7.b003.27c8.a831.c66d.983e.5152.
498 76f9.88da.5cb0.a9dc.4a74.84aa.2de9.2c6f.
499 240c.a1cc.0fc1.9dc6.efbe.4786.e49b.69c1.
500 c19b.f174.9bdc.06a7.80de.b1fe.72be.5d74.
501 550c.7dc3.2431.85be.1283.5b01.d807.aa98.
502 ab1c.5ed5.923f.82a4.59f1.11f1.3956.c25b.
503 e9b5.dba5.b5c0.fbcf.7137.4491.428a.2f98
504 =+ ^= hax 0x5be0.cd19.1f83.d9ab.9b05.688c.510e.527f.
505 a54f.f53a.3c6e.f372.bb67.ae85.6a09.e667
506 =+ i=0
507 |- ^- @
508 ?: =(i lex)
509 (rep 5 (turn (rip 5 hax) net))
510 =+ ^= wox
511 =+ dux=(cut 9 [i 1] ful)
512 =+ wox=(rep 5 (turn (rip 5 dux) net))
513 =+ j=16
514 |- ^- @
515 ?: =(64 j)
516 wox
517 =+ :* l=(wac (sub j 15) wox)
518 m=(wac (sub j 2) wox)
519 n=(wac (sub j 16) wox)
520 o=(wac (sub j 7) wox)
521 ==
522 =+ x=:(mix (ror 0 7 l) (ror 0 18 l) (rsh 0 3 l))
523 =+ y=:(mix (ror 0 17 m) (ror 0 19 m) (rsh 0 10 m))
524 =+ z=:(sum n x o y)
525 $(wox (con (lsh 5 j z) wox), j +(j))
526 =+ j=0
527 =+ :* a=(wac 0 hax)
528 b=(wac 1 hax)
529 c=(wac 2 hax)
530 d=(wac 3 hax)
531 e=(wac 4 hax)
532 f=(wac 5 hax)
533 g=(wac 6 hax)
534 h=(wac 7 hax)
535 ==
536 |- ^- @
537 ?: =(64 j)
538 %= ^$
539 i +(i)
540 hax %+ rep 5
541 :~ (sum a (wac 0 hax))
542 (sum b (wac 1 hax))
543 (sum c (wac 2 hax))
544 (sum d (wac 3 hax))
545 (sum e (wac 4 hax))
546 (sum f (wac 5 hax))
547 (sum g (wac 6 hax))
548 (sum h (wac 7 hax))
549 ==
550 ==
551 =+ l=:(mix (ror 0 2 a) (ror 0 13 a) (ror 0 22 a)) :: s0
552 =+ m=:(mix (dis a b) (dis a c) (dis b c)) :: maj
553 =+ n=(sum l m) :: t2
554 =+ o=:(mix (ror 0 6 e) (ror 0 11 e) (ror 0 25 e)) :: s1
555 =+ p=(mix (dis e f) (dis (inv e) g)) :: ch
556 =+ q=:(sum h o p (wac j kbx) (wac j wox)) :: t1
557 $(j +(j), a (sum q n), b a, c b, d c, e (sum d q), f e, g f, h g)
558```
560#### Examples
562```
563 > (shay 1 'hello')
564 \/16.144.219.278.061.159.438.339.586.294.967.166.038.336.988.797.862.808.055.174.98\/
565 7.398.597.302.069.674
566 \/
568 > (shay 2 'hello')
569 \/100.467.333.538.737.303.691.714.735.404.408.035.555.613.179.595.938.688.113.300.8\/
570 01.974.878.934.544.183
571 \/
572```
574#### Discussion
576Because byte-strings can have leading zeros, but atoms cannot, we use `len`
577as a way of saying that the atom `ruz` is shorter than its representative
578byte-string.
580---
581### `++shaz`
583SHA-512
585Produces an atom by hashing an atom `ruz` with SHA-512.
587#### Accepts
589`ruz` is an atom.
591#### Produces
593An atom.
595#### Source
597```hoon
598 ++ shaz
599 |= ruz=@ ^- @
600 (shal [(met 3 ruz) ruz])
601```
603#### Examples
605```
606 > (shaz 'hello')
607 \/3.548.533.422.469.437.734.729.094.584.175.910.682.076.656.883.559.953.324.378.007\/
608 .735.849.386.038.666.450.748.109.671.344.747.196.048.200.348.948.408.339.256.384.
609 360.070.359.656.053.016.948.640.159.265.179
610 \/
611```
613---
614### `++og`
616Container arm for SHA-256-powered random-number generation. Its sample `a` is an
617atom that is used as a seed for the hash.
619#### Accepts
621`a` is an atom.
623#### Produces
625A core.
627#### Source
629```hoon
630 ++ og
631 ~/ %og
632 |_ a=@
633```
635#### Examples
637```
638 > ~(. og 919)
639 <4.wmp {a/@ud <54.tyv 119.olq 31.ohr 1.jmk $143>}>
640```
642#### Discussion
644Note that the product is deterministic; the seed will produce the same
645result every time it is run. Use `eny`, 256 bits of entropy, for a
646non-deterministic product.
648---
649### `++rad:og`
651Random in range
653Produces a random number that is within the range of first `b` whole numbers,
654starting at `0`.
656#### Accepts
658`b` is an atom.
660#### Produces
662An atom.
664#### Source
666```hoon
667 ++ rad
668 |= b=@ ^- @
669 =+ c=(raw (met 0 b))
670 ?:((lth c b) c $(a +(a)))
671```
673#### Examples
675```
676 > (~(rad og 5) 11)
677 4
679 > (~(rad og 758.716.593) 11)
680 2
682 > (~(rad og 1) 100.000)
683 71.499
685 > (~(rad og eny) 11) :: `eny` acts as a random sample
686 7
687```
689---
690### `++rads:og`
692Random continuation
694Produces a cell. The head of the cell is a random number that is within the
695range of first `b` whole numbers, starting at `0`. The tail is a new core
696produced from hashing the parent core with `(rad b)`.
698#### Accepts
700`b` is an atom.
702#### Produces
704A cell.
706#### Source
708```hoon
709 ++ rads
710 |= b=@
711 =+ r=(rad b)
712 [r +>.$(a (shas %og-s (mix a r)))]
713```
715#### Examples
717```
718 > (~(rads og 4) 10)
719 [2 <4.wmp {a/@ <54.tyv 119.olq 31.ohr 1.jmk $143>}>]
721 > =/ rng ~(. og 7)
722 =^ a rng (rads:rng 10)
723 =^ b rng (rads:rng 10)
724 [a b]
725 [2 8]
726```
728#### Discussion
730Since everything in Hoon is a pure function, we need to use tricks like this to
731generate separate random values from the same seed. Notice how we jump from
732one `rads` function call to another in the above example.
734---
735### `++raw:og`
737Random bits
739Produces an atom with a bitwidth `b` that is composed of random bits.
741#### Accepts
743`b` is an atom.
745#### Produces
747An atom.
749#### Source
751```hoon
752 ++ raw
753 ~/ %raw
754 |= b=@ ^- @
755 %+ can
756 0
757 =+ c=(shas %og-a (mix b a))
758 |- ^- (list [@ @])
759 ?: =(0 b)
760 ~
761 =+ d=(shas %og-b (mix b (mix a c)))
762 ?: (lth b 256)
763 [[b (end 0 b d)] ~]
764 [[256 d] $(c d, b (sub b 256))]
765```
767#### Examples
769```
770 > `@ud`(~(raw og 27) 4)
771 0b1001
773 > `@ub`(~(raw og 27) 3)
774 0b0
776 > `@ub`(~(raw og 11) 4)
777 0b1111
779 > `@ub`(~(raw og 11) 3)
780 0b100
781```
783---
784### `++raws:og`
786Random bits continuation
788Produces a cell. The head of the cell is an atom with a bitwidth `b` that is
789composed of random bits. The tail is a new core produced from hashing the
790parent core with `(raw b)`.
792#### Source
794```hoon
795 ++ raws
796 |= b=@
797 =+ r=(raw b)
798 [r +>.$(a (shas %og-s r))]
799 --
800```
802#### Examples
804```
805 > `[@ub _og]`(~(raws og 7) 4)
806 [0b1100 <4.wmp {a/@ <54.tyv 119.olq 31.ohr 1.jmk $143>}>]
808 > =/ rng ~(. og 7)
809 =^ a rng (rads:rng 4)
810 =^ b rng (rads:rng 4)
811 [`@ub`a `@ub`b]
812 [0b10 0b1]
813```
815#### Discussion
817Since everything in Hoon is a pure function, we need to use tricks like this to
818generate separate random values from the same seed. Notice how we jump from
819one `raws` function call to another in the above example.
821---