/* Copyright (c) 2013 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ namespace lean { void mix(unsigned & a, unsigned & b, unsigned & c) { a -= b; a -= c; a ^= (c >> 13); b -= c; b -= a; b ^= (a << 8); c -= a; c -= b; c ^= (b >> 13); a -= b; a -= c; a ^= (c >> 12); b -= c; b -= a; b ^= (a << 16); c -= a; c -= b; c ^= (b >> 5); a -= b; a -= c; a ^= (c >> 3); b -= c; b -= a; b ^= (a << 10); c -= a; c -= b; c ^= (b >> 15); } // Bob Jenkin's hash function. // http://burtleburtle.net/bob/hash/doobs.html unsigned hash_str(unsigned length, char const * str, unsigned init_value) { register unsigned a, b, c, len; /* Set up the internal state */ len = length; a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ c = init_value; /* the previous hash value */ /*---------------------------------------- handle most of the key */ while (len >= 12) { a += reinterpret_cast(str)[0]; b += reinterpret_cast(str)[1]; c += reinterpret_cast(str)[2]; mix(a, b, c); str += 12; len -= 12; } /*------------------------------------- handle the last 11 bytes */ c += length; switch (len) { /* all the case statements fall through */ case 11: c+=((unsigned)str[10] << 24); case 10: c+=((unsigned)str[9] << 16); case 9 : c+=((unsigned)str[8] << 8); /* the first byte of c is reserved for the length */ case 8 : b+=((unsigned)str[7] << 24); case 7 : b+=((unsigned)str[6] << 16); case 6 : b+=((unsigned)str[5] << 8); case 5 : b+=str[4]; case 4 : a+=((unsigned)str[3] << 24); case 3 : a+=((unsigned)str[2] << 16); case 2 : a+=((unsigned)str[1] << 8); case 1 : a+=str[0]; /* case 0: nothing left to add */ } mix(a, b, c); /*-------------------------------------------- report the result */ return c; } }