checksums.xxhash: cleanup, faster.

db4
John Benediktsson 2014-02-27 13:59:34 -08:00
parent 0fb0eaa1cf
commit 5e4ac4b698
1 changed files with 19 additions and 16 deletions

View File

@ -17,10 +17,23 @@ TUPLE: xxhash seed ;
C: <xxhash> xxhash C: <xxhash> xxhash
<PRIVATE
:: native-mapper ( from to bytes c-type -- seq )
from to bytes <slice>
bytes byte-array? little-endian? and
[ c-type cast-array ]
[ c-type heap-size <groups> [ le> ] map ] if ; inline
PRIVATE>
M:: xxhash checksum-bytes ( bytes checksum -- value ) M:: xxhash checksum-bytes ( bytes checksum -- value )
checksum seed>> :> seed checksum seed>> :> seed
bytes length :> len bytes length :> len
len dup 16 mod - :> len/16
len dup 4 mod - :> len/4
len 16 >= [ len 16 >= [
seed prime1 w+ prime2 w+ seed prime1 w+ prime2 w+
@ -28,12 +41,7 @@ M:: xxhash checksum-bytes ( bytes checksum -- value )
seed seed
seed prime1 w- seed prime1 w-
bytes byte-array? little-endian? and [ 0 len/16 bytes uint native-mapper
0 len dup 16 mod - 4 - 4 <range>
[ bytes <displaced-alien> uint deref ] map
] [
bytes len 16 mod head-slice* 4 <groups> [ le> ] map
] if
4 <groups> [ 4 <groups> [
first4 first4
@ -53,16 +61,11 @@ M:: xxhash checksum-bytes ( bytes checksum -- value )
len w+ len w+
bytes len 16 mod tail-slice* len/16 len/4 bytes uint native-mapper
dup length dup 4 mod - cut-slice [ [ prime3 w* w+ 17 bitroll-32 prime4 w* ] each
4 <groups> [
le> prime3 w* w+ 17 bitroll-32 prime4 w* bytes len/4 tail-slice
] each [ prime5 w* w+ 11 bitroll-32 prime1 w* ] each
] [
[
prime5 w* w+ 11 bitroll-32 prime1 w*
] each
] bi*
[ -15 shift ] [ bitxor ] bi prime2 w* [ -15 shift ] [ bitxor ] bi prime2 w*
[ -13 shift ] [ bitxor ] bi prime3 w* [ -13 shift ] [ bitxor ] bi prime3 w*