Re: ipv4: Simplify ARP hash function.
From: Stephen Hemminger <hidden>
Date: 2011-07-08 23:41:31
What about using murmur hash which has a four byte pass as well. https://sites.google.com/site/murmurhash/ --- #include <stdio.h> #include <stdint.h> #include <stdlib.h> #define u32 uint32_t /* Do a one pass murmurhash2 */ static u32 arp_hashfn(u32 key, int ifindex, u32 hash_rnd) { /* murmurhash mixiing constants */ const unsigned int m = 0x5bd1e995; const int r = 24; /* Initialize the hash to a 'random' value */ unsigned int h = ifindex ^ hash_rnd; unsigned int k = key; k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; /* Do a few final mixes of the hash to ensure the last few * bytes are well-incorporated. */ h ^= h >> 13; h *= m; h ^= h >> 15; return h; } int main(int argc, char **argv) { u32 rnd, key, hash; int ifindex; key = atoi(argv[1]); ifindex = atoi(argv[2]); rnd = atoi(argv[3]); hash = arp_hashfn(key, ifindex, rnd); printf("%u, %d, %u => %u\n", key, ifindex, rnd, hash); return 0; }