checksums.murmur: implementation of MurmurHash.

db4
John Benediktsson 2013-11-22 10:34:19 -08:00
parent 52498a9f67
commit 1367ced138
5 changed files with 63 additions and 0 deletions

View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
MurmurHash checksum algorithm