`
hanyh
  • 浏览: 228837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

email地址hash分片的python模块

阅读更多
为了提高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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics