X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fhash.h;h=5f6409cb135e71ef25ab9dfdefb36ad273673f78;hb=4f2226487d3522654876885d769510b835c5f5ee;hp=2015a639fc1b321d319fa4cb4e463e97793e1b54;hpb=cce1d8bd8e326c93579a6ff5d037fe3a60a39f86;p=sliver-openvswitch.git diff --git a/lib/hash.h b/lib/hash.h index 2015a639f..5f6409cb1 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -16,6 +16,7 @@ #ifndef HASH_H #define HASH_H 1 +#include #include #include #include @@ -64,16 +65,29 @@ static inline uint32_t hash_int(uint32_t x, uint32_t basis) x ^= x >> 17; x -= x << 9; x ^= x << 4; + x += basis; x -= x << 3; x ^= x << 10; x ^= x >> 15; - return x + basis; + return x; +} + +/* An attempt at a useful 1-bit hash function. Has not been analyzed for + * quality. */ +static inline uint32_t hash_boolean(bool x, uint32_t basis) +{ + enum { P0 = 0xc2b73583 }; /* This is hash_int(1, 0). */ + enum { P1 = 0xe90f1258 }; /* This is hash_int(2, 0). */ + return (x ? P0 : P1) ^ HASH_ROT(basis, 1); } static inline uint32_t hash_double(double x, uint32_t basis) { - BUILD_ASSERT_DECL(sizeof x == 8); - return hash_2words((const uint32_t *) &x, basis); + uint32_t value[2]; + BUILD_ASSERT_DECL(sizeof x == sizeof value); + + memcpy(value, &x, sizeof value); + return hash_2words(value, basis); } static inline uint32_t hash_pointer(const void *p, uint32_t basis)