#include #include static uint32_t sysv_hash(const char *name) { const unsigned char *p = (const unsigned char *) name; uint32_t h = 0; while (__predict_true(*p != '\0')) { h = (h << 4) + *p++; h ^= (h >> 24) & 0xf0; } return h & 0x0fffffff; } static unsigned long sysv_hash_old(const char *name) { const unsigned char *p = (const unsigned char *) name; unsigned long h = 0; unsigned long g; unsigned long c; for (; __predict_true((c = *p) != '\0'); p++) { h <<= 4; h += c; if ((g = h & 0xf0000000) != 0) { h ^= g; h ^= g >> 24; } } return h; } static unsigned long sysv_hash_freebsd(const char *name) { const unsigned char *p = (const unsigned char *)name; unsigned long h = 0; unsigned long g; while (*p != '\0') { h = (h << 4) + *p++; if ((g = h & 0xf0000000) != 0) h ^= g >> 24; h &= ~g; } return h; } int main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) { printf("%s: %#x %#lx %#lx\n", argv[i], sysv_hash(argv[i]), sysv_hash_old(argv[i]), sysv_hash_freebsd(argv[i])); } return 0; }