From 93e36dd664a9d3f95456769ca2d29c48503bd0e7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 10 Dec 2010 17:56:14 -0800 Subject: add a new TDB::HashFunctions module It's nice to have common hash functions available... --- ext/tdb/hash_functions.c | 40 ++++++++++++++++++++++++++++++++++++++++ ext/tdb/tdb.c | 1 + 2 files changed, 41 insertions(+) create mode 100644 ext/tdb/hash_functions.c (limited to 'ext') diff --git a/ext/tdb/hash_functions.c b/ext/tdb/hash_functions.c new file mode 100644 index 0000000..7cf69f1 --- /dev/null +++ b/ext/tdb/hash_functions.c @@ -0,0 +1,40 @@ +#include "rbtdb.h" + +#define HASH_FN(fn) \ +static VALUE fn(VALUE self,VALUE str) \ +{ \ + TDB_DATA data; \ + StringValue(str); \ + data.dptr = (unsigned char *)RSTRING_PTR(str); \ + data.dsize = RSTRING_LEN(str); \ + return UINT2NUM(rbtdb_##fn(&data)); \ +} + +HASH_FN(murmur1) +HASH_FN(murmur1_aligned) +HASH_FN(murmur2) +HASH_FN(murmur2a) +HASH_FN(murmur2_neutral) +HASH_FN(murmur2_aligned) +HASH_FN(fnv1a) +HASH_FN(djb2) +HASH_FN(djb3) +HASH_FN(jenkins_lookup3) + +#define HASH_M(fn) rb_define_method(mHashFunctions, "tdb_hash_"#fn, fn, 1) +void rbtdb_init_tdb_hash_functions(void) +{ + VALUE cTDB = rb_const_get(rb_cObject, rb_intern("TDB")); + VALUE mHashFunctions = rb_define_module_under(cTDB, "HashFunctions"); + + HASH_M(murmur1); + HASH_M(murmur1_aligned); + HASH_M(murmur2); + HASH_M(murmur2a); + HASH_M(murmur2_neutral); + HASH_M(murmur2_aligned); + HASH_M(fnv1a); + HASH_M(djb2); + HASH_M(djb3); + HASH_M(jenkins_lookup3); +} diff --git a/ext/tdb/tdb.c b/ext/tdb/tdb.c index d1b573a..196e29d 100644 --- a/ext/tdb/tdb.c +++ b/ext/tdb/tdb.c @@ -737,6 +737,7 @@ void Init_tdb_ext(void) /* Better hashing, but can't be opened by tdb < 1.2.6. */ rb_define_const(cTDB, "INCOMPATIBLE_HASH", UINT2NUM(TDB_INCOMPATIBLE_HASH)); #endif + rbtdb_init_tdb_hash_functions(); } /* -- cgit v1.2.3-24-ge0c7