mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
Marc-Andre Lemburg <mal@lemburg.com>:
Utility extension module needed by perfect_hash.py By Bill Tutt.
This commit is contained in:
parent
0f774e3987
commit
93c409a590
1 changed files with 72 additions and 0 deletions
72
Tools/perfecthash/perfhash.c
Normal file
72
Tools/perfecthash/perfhash.c
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include <Python.h>
|
||||
|
||||
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");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue