Skip to content

Commit

Permalink
Expose MurmurHash3 to Python land, remove cast
Browse files Browse the repository at this point in the history
  • Loading branch information
luizirber committed Jan 23, 2015
1 parent db6a629 commit 883a3ef
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 2 deletions.
3 changes: 3 additions & 0 deletions khmer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
from khmer._khmer import reverse_hash # tests/test_functions.py
# tests/counting_single.py

from khmer._khmer import hash_murmur3 # tests/test_functions.py
from khmer._khmer import hash_no_rc_murmur3 # tests/test_functions.py

from khmer._khmer import get_version_cpp as __version_cpp__
# tests/test_version.py

Expand Down
36 changes: 36 additions & 0 deletions khmer/_khmermodule.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4467,6 +4467,28 @@ static PyObject * reverse_hash(PyObject * self, PyObject * args)
return PyString_FromString(_revhash(val, ksize).c_str());
}

static PyObject * murmur3_forward_hash(PyObject * self, PyObject * args)
{
const char * kmer;

if (!PyArg_ParseTuple(args, "s", &kmer)) {
return NULL;
}

return PyLong_FromUnsignedLongLong(_hash_murmur(kmer));
}

static PyObject * murmur3_forward_hash_no_rc(PyObject * self, PyObject * args)
{
const char * kmer;

if (!PyArg_ParseTuple(args, "s", &kmer)) {
return NULL;
}

return PyLong_FromUnsignedLongLong(_hash_murmur_forward(kmer));
}

static PyObject * set_reporting_callback(PyObject * self, PyObject * args)
{
PyObject * o;
Expand Down Expand Up @@ -4543,6 +4565,20 @@ static PyMethodDef KhmerMethods[] = {
"reverse_hash", reverse_hash,
METH_VARARGS, "",
},
{
"hash_murmur3",
murmur3_forward_hash,
METH_VARARGS,
"Calculate the hash value of a k-mer using MurmurHash3 "
"(with reverse complement)",
},
{
"hash_no_rc_murmur3",
murmur3_forward_hash_no_rc,
METH_VARARGS,
"Calculate the hash value of a k-mer using MurmurHash3 "
"(no reverse complement)",
},
{
"set_reporting_callback", set_reporting_callback,
METH_VARARGS, "",
Expand Down
4 changes: 2 additions & 2 deletions lib/kmer_hash.cc
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,11 @@ HashIntoType _hash_murmur(const std::string& kmer,
{
HashIntoType out[2];
uint32_t seed = 0;
MurmurHash3_x64_128((void *)kmer.c_str(), (int)kmer.size(), seed, &out);
MurmurHash3_x64_128((void *)kmer.c_str(), kmer.size(), seed, &out);
h = out[0];

std::string rev = khmer::_revcomp(kmer);
MurmurHash3_x64_128((void *)rev.c_str(), (int)rev.size(), seed, &out);
MurmurHash3_x64_128((void *)rev.c_str(), rev.size(), seed, &out);
r = out[0];

return h ^ r;
Expand Down
21 changes: 21 additions & 0 deletions tests/test_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,27 @@ def test_reverse_hash():
assert s == "GGGG"


def test_hash_murmur3():
assert khmer.hash_murmur3('AAAA') == 526240128537019279
assert khmer.hash_murmur3('TTTT') == 526240128537019279
assert khmer.hash_murmur3('CCCC') == 14391997331386449225
assert khmer.hash_murmur3('GGGG') == 14391997331386449225


def test_hash_no_rc_murmur3():
h = khmer.hash_no_rc_murmur3('AAAA')
assert h == 5231866503566620412, h

h = khmer.hash_no_rc_murmur3('TTTT')
assert h == 5753003579327329651, h

h = khmer.hash_no_rc_murmur3('CCCC')
assert h == 3789793362494378039, h

h = khmer.hash_no_rc_murmur3('GGGG')
assert h == 17519752047064575358, h


def test_get_primes():
primes = khmer.get_n_primes_near_x(7, 20)

Expand Down

0 comments on commit 883a3ef

Please sign in to comment.