checksums.murmur: implementation of MurmurHash.
parent
52498a9f67
commit
1367ced138
|
@ -0,0 +1 @@
|
|||
John Benediktsson
|
|
@ -0,0 +1,11 @@
|
|||
USING: help.markup help.syntax ;
|
||||
IN: checksums.murmur
|
||||
|
||||
HELP: murmur3-32
|
||||
{ $class-description "MurmurHash3 32-bit checksum algorithm." } ;
|
||||
|
||||
ARTICLE: "checksums.murmur" "MurmurHash checksum"
|
||||
"MurmurHash is a non-cryptographic hash function suitable for general hash-based lookup, created by Austin Appleby in 2008."
|
||||
{ $subsections murmur3-32 } ;
|
||||
|
||||
ABOUT: "checksums.murmur"
|
|
@ -0,0 +1,9 @@
|
|||
USING: checksums tools.test ;
|
||||
IN: checksums.murmur
|
||||
|
||||
{ 455139366 } [ "asdf" 0 <murmur3-32> checksum-bytes ] unit-test
|
||||
{ 417250299 } [ "asdf" 156 <murmur3-32> checksum-bytes ] unit-test
|
||||
{ -392455434 } [ "abcde" 0 <murmur3-32> checksum-bytes ] unit-test
|
||||
{ -1850534962 } [ "12345678" 0 <murmur3-32> checksum-bytes ] unit-test
|
||||
{ -1710454456 } [ "12345678" 156 <murmur3-32> checksum-bytes ] unit-test
|
||||
{ -734568571 } [ "hello, world!!!" 156 <murmur3-32> checksum-bytes ] unit-test
|
|
@ -0,0 +1,41 @@
|
|||
! Copyright (C) 2013 John Benediktsson.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors checksums fry grouping io.binary kernel math
|
||||
math.bitwise sequences ;
|
||||
IN: checksums.murmur
|
||||
|
||||
TUPLE: murmur3-32 seed ;
|
||||
|
||||
C: <murmur3-32> murmur3-32
|
||||
|
||||
CONSTANT: c1 0xcc9e2d51
|
||||
CONSTANT: c2 0x1b873593
|
||||
CONSTANT: r1 15
|
||||
CONSTANT: r2 13
|
||||
CONSTANT: m 5
|
||||
CONSTANT: n 0xe6546b64
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: 32-bit ( n -- n' ) 32 on-bits mask ; inline
|
||||
|
||||
: rotl ( k r -- k' )
|
||||
[ shift ] [ 32 - shift ] 2bi bitor ; inline
|
||||
|
||||
: (hash-chunk) ( k -- k' )
|
||||
c1 * 32-bit r1 rotl c2 * 32-bit ; inline
|
||||
|
||||
: hash-chunk ( hash k -- hash' )
|
||||
(hash-chunk) bitxor r2 rotl m * n + 32-bit ; inline
|
||||
|
||||
PRIVATE>
|
||||
|
||||
M: murmur3-32 checksum-bytes ( bytes checksum -- value )
|
||||
[ [ length ] keep over 4 mod cut* ] [ seed>> 32-bit ] bi*
|
||||
'[ 4 <groups> _ [ le> hash-chunk ] reduce ]
|
||||
[ be> (hash-chunk) bitxor bitxor 32-bit ] bi*
|
||||
[ -16 shift ] [ bitxor 0x85ebca6b * 32-bit ] bi
|
||||
[ -13 shift ] [ bitxor 0xc2b2ae35 * 32-bit ] bi
|
||||
[ -16 shift ] [ bitxor 32 >signed ] bi ;
|
||||
|
||||
INSTANCE: murmur3-32 checksum
|
|
@ -0,0 +1 @@
|
|||
MurmurHash checksum algorithm
|
Loading…
Reference in New Issue