31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'ext/hashword_core.c', line 31
VALUE
rb_cObject_hashword(VALUE self, VALUE key, VALUE len, VALUE init) {
VALUE *k = RARRAY_PTR(key);
size_t length = (size_t) NUM2UINT(len);
uint32_t initval = NUM2UINT(init);
uint32_t a, b, c;
a = b = c = 0xdeadbeef + (((uint32_t) length) << 2) + initval;
while (length > 3) {
a += NUM2UINT(k[0]);
b += NUM2UINT(k[1]);
c += NUM2UINT(k[2]);
mix(a, b, c);
length -= 3;
k += 3;
}
switch (length) {
case 3: c += NUM2UINT(k[2]);
case 2: b += NUM2UINT(k[1]);
case 1:
a += NUM2UINT(k[0]);
final(a, b, c);
break;
}
return UINT2NUM(c);
}
|