#include "global.h" #include "exec.h" #include "interpret.h" #include "object.h" #include "array.h" #include "stralloc.h" unsigned int hashmem(const char *a,int len,int mlen) { unsigned int ret; ret=9248339*len; if(len<mlen) mlen=len; switch(mlen&7) { case 7: ret^=*(a++); case 6: ret^=(ret<<4)+*(a++); case 5: ret^=(ret<<7)+*(a++); case 4: ret^=(ret<<6)+*(a++); case 3: ret^=(ret<<3)+*(a++); case 2: ret^=(ret<<7)+*(a++); case 1: ret^=(ret<<5)+*(a++); } #ifdef HANDLES_UNALIGNED_MEMORY_ACCESS for(mlen>>=3;--mlen>=0;) { ret^=(ret<<7)+*(((unsigned int *)a)++); ret^=(ret>>6)+*(((unsigned int *)a)++); } #else for(mlen>>=3;--mlen>=0;) { ret^=(ret<<7)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++)); ret^=(ret>>6)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++)); } #endif return ret; } unsigned int hashstr(const char *str,int maxn) { return hashmem(str,strlen(str),maxn); } unsigned int hash_svalue(struct svalue *s,unsigned int size) { switch (s->type) { case T_NUMBER: return (s->u.number) % size; case T_OBJECT: return (s->u.ob->clone_number) % size; case T_STRING: return hashstr(strptr(s),100) % size; case T_POINTER: case T_ALIST_PART: return s->u.vec->size % size; case T_LIST: case T_MAPPING: return s->u.vec->item[0].u.vec->size % size; default: return 0; } }