unsigned long hash(const char *name,size_t len) { unsigned long h=(unsigned long)len; size_t step = (len>>5)+1; for (size_t i=len; i>=step; i-=step) h = h ^ ((h<<5)+(h>>2)+(unsigned long)name[i-1]); return h; }