X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/4769a870917b98723690aa336d12d0656769528b..c043fa535514a76091be87a45ad472a505f9dd33:/lunaix-os/libs/hash.c diff --git a/lunaix-os/libs/hash.c b/lunaix-os/libs/hash.c index 293ec67..7182ab6 100644 --- a/lunaix-os/libs/hash.c +++ b/lunaix-os/libs/hash.c @@ -1,21 +1,28 @@ -#include +#include +#include /** - * @brief Simple string hash function + * @brief Simple string hash function (sdbm) * - * ref: https://stackoverflow.com/a/7666577 + * ref: http://www.cse.yorku.ca/~oz/hash.html + * + * sdbm has lower standard deviation in bucket distribution + * than djb2 (previously used) for low bucket size (16, 32). * * @param str * @return unsigned int */ -uint32_t -strhash_32(unsigned char* str, uint32_t truncate_to) +u32_t _weak +strhash_32(const char* str, u32_t truncate_to) { - uint32_t hash = 5381; + if (!str) + return 0; + + u32_t hash = 0; int c; - while (c = *str++) - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + while ((c = *str++)) + hash = (hash << 6) + (hash << 16) + c - hash; return hash >> (HASH_SIZE_BITS - truncate_to); } \ No newline at end of file