From: Marc-André Lemburg Date: Wed, 28 Jun 2000 16:48:05 +0000 (+0000) Subject: Marc-Andre Lemburg : X-Git-Tag: v2.0b1~1367 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93c409a590b00ea5b28112fe2b7ca3bc862850b8;p=python Marc-Andre Lemburg : Utility extension module needed by perfect_hash.py By Bill Tutt. --- diff --git a/Tools/perfecthash/perfhash.c b/Tools/perfecthash/perfhash.c new file mode 100644 index 0000000000..e7ba0c75da --- /dev/null +++ b/Tools/perfecthash/perfhash.c @@ -0,0 +1,72 @@ +#include + +static PyObject * hashFunction(PyObject *self, PyObject *args, PyObject *kw) +{ + PyStringObject *a; + register int len; + register unsigned char *p; + register long x; + long lSeed; + unsigned long cchSeed; + + if (!PyArg_ParseTuple(args, "iiO:hash", &lSeed, &cchSeed, &a)) + return NULL; + if (!PyString_Check(a)) + { + PyErr_SetString(PyExc_TypeError, "arg 3 needs to be a string"); + return NULL; + } + + len = a->ob_size; + p = (unsigned char *) a->ob_sval; + x = lSeed; + while (--len >= 0) + x = (1000003*x) ^ *p++; + x ^= a->ob_size + cchSeed; + if (x == -1) + x = -2; + return PyInt_FromLong(x); +} + +static PyObject * calcSeed(PyObject *self, PyObject *args, PyObject *kw) +{ + PyStringObject *a; + register int len; + register unsigned char *p; + register long x; + + if (!PyString_Check(args)) + { + PyErr_SetString(PyExc_TypeError, "arg 1 expected a string, but didn't get it."); + return NULL; + } + + a = (PyStringObject *)args; + + len = a->ob_size; + p = (unsigned char *) a->ob_sval; + x = *p << 7; + while (--len >= 0) + x = (1000003*x) ^ *p++; + return PyInt_FromLong(x); +} + + +static struct PyMethodDef hashMethods[] = { + { "calcSeed", calcSeed, 0, NULL }, + { "hash", hashFunction, 0, NULL }, + { NULL, NULL, 0, NULL } /* sentinel */ +}; + +#ifdef _MSC_VER +_declspec(dllexport) +#endif +void initperfhash() +{ + PyObject *m; + + m = Py_InitModule4("perfhash", hashMethods, + NULL, NULL, PYTHON_API_VERSION); + if ( m == NULL ) + Py_FatalError("can't initialize module hashModule"); +}