1 ! Copyright (C) 2014 John Benediktsson.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: accessors alien alien.c-types alien.data byte-arrays
5 checksums combinators generalizations grouping io.binary kernel
6 locals math math.bitwise math.ranges sequences ;
10 CONSTANT: prime1 2654435761
11 CONSTANT: prime2 2246822519
12 CONSTANT: prime3 3266489917
13 CONSTANT: prime4 668265263
14 CONSTANT: prime5 374761393
22 :: native-mapper ( from to bytes c-type -- seq )
24 bytes byte-array? little-endian? and
26 [ c-type heap-size <groups> [ le> ] map ] if ; inline
30 M:: xxhash checksum-bytes ( bytes checksum -- value )
31 checksum seed>> :> seed
34 len dup 16 mod - :> len/16
35 len dup 4 mod - :> len/4
39 seed prime1 w+ prime2 w+
44 0 len/16 bytes uint native-mapper
48 [ prime2 w* w+ 13 bitroll-32 prime1 w* ]
64 len/16 len/4 bytes uint native-mapper
65 [ prime3 w* w+ 17 bitroll-32 prime4 w* ] each
67 bytes len/4 tail-slice
68 [ prime5 w* w+ 11 bitroll-32 prime1 w* ] each
70 [ -15 shift ] [ bitxor ] bi prime2 w*
71 [ -13 shift ] [ bitxor ] bi prime3 w*
72 [ -16 shift ] [ bitxor ] bi ;
74 INSTANCE: xxhash checksum