为了提高hash的速度,使用扩展模块。
#include <Python.h>
#define HASH_OU_NUMS 67
unsigned long CreateHashId(const char *pcchUid,int hashNum)
{
unsigned long ulMicId = 5381;
unsigned char uiChar = 0;
char uiChar_t = 0;
const unsigned long ulMask = 0xFFFFFFFF; //ulMask = 2^32-1, unsigned long on 32bit system;
if(hashNum < 2) {
hashNum = HASH_OU_NUMS;
}
while (*pcchUid)
{
uiChar_t = *pcchUid;
/* ulMicId * 33 + uiChar */
uiChar = (u_char) uiChar_t;
ulMicId = ((ulMicId << 5) + ulMicId) + uiChar;
pcchUid++;
}
ulMicId = ulMicId & ulMask;
ulMicId = ulMicId % hashNum;
return ulMicId;
}
static PyObject * wrap_create_hash_id(PyObject *self, PyObject *args)
{
const char * email;
int hashNum = 0;
int hashId = 0;
if (!PyArg_ParseTuple(args, "s|i", &email,&hashNum))//这句是把python的变量args转换成c的变量command
return NULL;
hashId = CreateHashId(email,hashNum);//调用c的函数
return Py_BuildValue("(i)",hashId);
//把c的返回值n转换成python的对象
}
// 3 方法列表
static PyMethodDef CreateHashMethods[] = {
{"hash", wrap_create_hash_id, METH_VARARGS, "create hash id."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initmailhash(void)
{
PyObject *m = Py_InitModule("mailhash", CreateHashMethods);
if (m == NULL) return;
}