1 ! Copyright (C) 2013 John Benediktsson.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: accessors checksums combinators fry grouping io.binary
5 kernel math math.bitwise sequences sequences.private ;
7 IN: checksums.superfast
9 TUPLE: superfast seed ;
10 C: <superfast> superfast
14 : 32-bit ( n -- n' ) 32 on-bits mask ; inline
16 : main-loop ( seq seed -- hash )
19 [ le> + ] [ le> 11 shift dupd bitxor ] bi*
20 [ 16 shift ] [ bitxor ] bi* 32-bit
21 [ -11 shift ] [ + ] bi
24 : end-case ( hash seq -- hash' )
28 first + [ 10 shift ] [ bitxor ] bi 32-bit
32 le> + [ 11 shift ] [ bitxor ] bi 32-bit
33 [ -17 shift ] [ + ] bi
37 [ le> + [ 16 shift ] [ bitxor ] bi ]
38 [ 18 shift bitxor ] bi* 32-bit
39 [ -11 shift ] [ + ] bi
43 : avalanche ( hash -- hash' )
44 [ 3 shift ] [ bitxor ] bi 32-bit
46 [ 4 shift ] [ bitxor ] bi 32-bit
47 [ -17 shift ] [ + ] bi
48 [ 25 shift ] [ bitxor ] bi 32-bit
49 [ -6 shift ] [ + ] bi ; inline
53 M: superfast checksum-bytes
54 [ dup length 4 mod cut* ] [ seed>> 32-bit ] bi*
55 '[ _ main-loop ] [ end-case ] bi* avalanche ;