From 1367ced138b3320e539b9761ef0b903bf894fce8 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Fri, 22 Nov 2013 10:34:19 -0800 Subject: [PATCH] checksums.murmur: implementation of MurmurHash. --- basis/checksums/murmur/authors.txt | 1 + basis/checksums/murmur/murmur-docs.factor | 11 ++++++ basis/checksums/murmur/murmur-tests.factor | 9 +++++ basis/checksums/murmur/murmur.factor | 41 ++++++++++++++++++++++ basis/checksums/murmur/summary.txt | 1 + 5 files changed, 63 insertions(+) create mode 100644 basis/checksums/murmur/authors.txt create mode 100644 basis/checksums/murmur/murmur-docs.factor create mode 100644 basis/checksums/murmur/murmur-tests.factor create mode 100644 basis/checksums/murmur/murmur.factor create mode 100644 basis/checksums/murmur/summary.txt diff --git a/basis/checksums/murmur/authors.txt b/basis/checksums/murmur/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/basis/checksums/murmur/authors.txt @@ -0,0 +1 @@ +John Benediktsson diff --git a/basis/checksums/murmur/murmur-docs.factor b/basis/checksums/murmur/murmur-docs.factor new file mode 100644 index 0000000000..da9f612075 --- /dev/null +++ b/basis/checksums/murmur/murmur-docs.factor @@ -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" diff --git a/basis/checksums/murmur/murmur-tests.factor b/basis/checksums/murmur/murmur-tests.factor new file mode 100644 index 0000000000..f07e21537e --- /dev/null +++ b/basis/checksums/murmur/murmur-tests.factor @@ -0,0 +1,9 @@ +USING: checksums tools.test ; +IN: checksums.murmur + +{ 455139366 } [ "asdf" 0 checksum-bytes ] unit-test +{ 417250299 } [ "asdf" 156 checksum-bytes ] unit-test +{ -392455434 } [ "abcde" 0 checksum-bytes ] unit-test +{ -1850534962 } [ "12345678" 0 checksum-bytes ] unit-test +{ -1710454456 } [ "12345678" 156 checksum-bytes ] unit-test +{ -734568571 } [ "hello, world!!!" 156 checksum-bytes ] unit-test diff --git a/basis/checksums/murmur/murmur.factor b/basis/checksums/murmur/murmur.factor new file mode 100644 index 0000000000..13e645f44a --- /dev/null +++ b/basis/checksums/murmur/murmur.factor @@ -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 + +CONSTANT: c1 0xcc9e2d51 +CONSTANT: c2 0x1b873593 +CONSTANT: r1 15 +CONSTANT: r2 13 +CONSTANT: m 5 +CONSTANT: n 0xe6546b64 + + + +M: murmur3-32 checksum-bytes ( bytes checksum -- value ) + [ [ length ] keep over 4 mod cut* ] [ seed>> 32-bit ] bi* + '[ 4 _ [ 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 diff --git a/basis/checksums/murmur/summary.txt b/basis/checksums/murmur/summary.txt new file mode 100644 index 0000000000..4ac7b4acb2 --- /dev/null +++ b/basis/checksums/murmur/summary.txt @@ -0,0 +1 @@ +MurmurHash checksum algorithm