about summary refs log tree commit diff stats
path: root/077hash.mu
blob: 77e564d9aff92941e68bea0e2477d862184411ad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# From http://burtleburtle.net/bob/hash/hashfaq.html#example
# Though this one doesn't behave the same because mu uses doubles under the
# hood, which wrap around at a different limit.
recipe hash x:address:shared:array:character -> n:number [
  local-scope
  load-ingredients
  n <- copy 0
  len:number <- length *x
  i:number <- copy 0
  {
    done?:boolean <- greater-or-equal i, len
    break-if done?
    c:character <- index *x, i
    n <- add n, c
    tmp1:number <- shift-left n, 10
    n <- add n, tmp1
    tmp2:number <- shift-right n, 6
    n <- xor-bits n, tmp2
    tmp3:number <- shift-left n, 3
    n <- add n, tmp3
    tmp4:number <- shift-right n, 11
    n <- xor-bits n, tmp4
    tmp5:number <- shift-left n, 15
    n <- add n, tmp5
    i <- add i, 1
    loop
  }
]