1 ! Copyright (C) 2018 John Benediktsson.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.data byte-arrays checksums
4 combinators endian grouping kernel math math.bitwise sequences ;
6 IN: checksums.metrohash
8 TUPLE: metrohash-64 seed ;
10 C: <metrohash-64> metrohash-64
14 :: native-mapper ( from to bytes c-type -- seq )
16 bytes byte-array? alien.data:little-endian? and
18 [ c-type heap-size <groups> [ le> ] map ] if ; inline
22 M:: metrohash-64 checksum-bytes ( bytes checksum -- value )
28 checksum seed>> :> seed
31 len dup 32 mod - :> len/32
32 len dup 16 mod - :> len/16
33 len dup 8 mod - :> len/8
34 len dup 4 mod - :> len/4
35 len dup 2 mod - :> len/2
39 h h h h :> ( v0! v1! v2! v3! )
42 0 len/32 bytes uint64_t native-mapper 4 <groups> [
44 [ k0 W* v0 W+ -29 bitroll-64 v2 W+ v0! ]
45 [ k1 W* v1 W+ -29 bitroll-64 v3 W+ v1! ]
46 [ k2 W* v2 W+ -29 bitroll-64 v0 W+ v2! ]
47 [ k3 W* v3 W+ -29 bitroll-64 v1 W+ v3! ]
51 v0 v3 W+ k0 W* v1 W+ -37 bitroll-64 k1 W* v2 bitxor v2!
52 v1 v2 W+ k1 W* v0 W+ -37 bitroll-64 k0 W* v3 bitxor v3!
53 v0 v2 W+ k0 W* v3 W+ -37 bitroll-64 k1 W* v0 bitxor v0!
54 v1 v3 W+ k1 W* v2 W+ -37 bitroll-64 k0 W* v1 bitxor v1!
59 len/32 len/16 bytes uint64_t native-mapper [
61 [ k2 W* v0 W+ -29 bitroll-64 k3 W* v1! ]
62 [ k2 W* v0 W+ -29 bitroll-64 k3 W* v2! ] bi*
63 v1 k0 W* -21 bitroll-64 v2 W+ v1 bitxor v1!
64 v2 k3 W* -21 bitroll-64 v1 W+ v2 bitxor v2!
68 len/16 len/8 bytes uint64_t native-mapper [
70 v0 -55 bitroll-64 k1 W* v0 bitxor v0!
73 len/8 len/4 bytes uint32_t native-mapper [
75 v0 -26 bitroll-64 k1 W* v0 bitxor v0!
78 len/4 len/2 bytes uint16_t native-mapper [
80 v0 -48 bitroll-64 k1 W* v0 bitxor v0!
83 bytes len/2 tail-slice [
85 v0 -37 bitroll-64 k1 W* v0 bitxor v0!
88 v0 -28 bitroll-64 v0 bitxor v0!
90 v0 -29 bitroll-64 v0 bitxor v0!
93 INSTANCE: metrohash-64 checksum
95 TUPLE: metrohash-128 seed ;
97 C: <metrohash-128> metrohash-128
99 M:: metrohash-128 checksum-bytes ( bytes checksum -- value )
105 checksum seed>> :> seed
108 len dup 32 mod - :> len/32
109 len dup 16 mod - :> len/16
110 len dup 8 mod - :> len/8
111 len dup 4 mod - :> len/4
112 len dup 2 mod - :> len/2
114 seed k0 W- k3 W* :> v0!
115 seed k1 W+ k2 W* :> v1!
116 seed k0 W+ k2 W* :> v2!
117 seed k1 W- k3 W* :> v3!
120 0 len/32 bytes uint64_t native-mapper 4 <groups> [
122 [ k0 W* v0 W+ -29 bitroll-64 v2 W+ v0! ]
123 [ k1 W* v1 W+ -29 bitroll-64 v3 W+ v1! ]
124 [ k2 W* v2 W+ -29 bitroll-64 v0 W+ v2! ]
125 [ k3 W* v3 W+ -29 bitroll-64 v1 W+ v3! ]
129 v0 v3 W+ k0 W* v1 W+ -21 bitroll-64 k1 W* v2 bitxor v2!
130 v1 v2 W+ k1 W* v0 W+ -21 bitroll-64 k0 W* v3 bitxor v3!
131 v0 v2 W+ k0 W* v3 W+ -21 bitroll-64 k1 W* v0 bitxor v0!
132 v1 v3 W+ k1 W* v2 W+ -21 bitroll-64 k0 W* v1 bitxor v1!
135 len/32 len/16 bytes uint64_t native-mapper [
137 [ k2 W* v0 W+ -33 bitroll-64 k3 W* v0! ]
138 [ k2 W* v1 W+ -33 bitroll-64 k3 W* v1! ] bi*
139 v0 k2 W* v1 W+ -45 bitroll-64 k1 W* v0 bitxor v0!
140 v1 k3 W* v0 W+ -45 bitroll-64 k0 W* v1 bitxor v1!
143 len/16 len/8 bytes uint64_t native-mapper [
144 first k2 W* v0 W+ -33 bitroll-64 k3 W* v0!
145 v0 k2 W* v1 W+ -27 bitroll-64 k1 W* v0 bitxor v0!
148 len/8 len/4 bytes uint32_t native-mapper [
149 first k2 W* v1 W+ -33 bitroll-64 k3 W* v1!
150 v1 k3 W* v0 W+ -46 bitroll-64 k0 W* v1 bitxor v1!
153 len/4 len/2 bytes uint16_t native-mapper [
154 first k2 W* v0 W+ -33 bitroll-64 k3 W* v0!
155 v0 k2 W* v1 W+ -22 bitroll-64 k1 W* v0 bitxor v0!
158 bytes len/2 tail-slice [
159 first k2 W* v1 W+ -33 bitroll-64 k3 W* v1!
160 v1 k3 W* v0 W+ -58 bitroll-64 k0 W* v1 bitxor v1!
163 v0 k0 W* v1 W+ -13 bitroll-64 v0 W+ v0!
164 v1 k1 W* v0 W+ -37 bitroll-64 v1 W+ v1!
165 v0 k2 W* v1 W+ -13 bitroll-64 v0 W+ v0!
166 v1 k3 W* v0 W+ -37 bitroll-64 v1 W+ v1!
170 INSTANCE: metrohash-128 checksum