#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"); }