X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=hash.c;h=bc65b7f6821b2e33f0cd6434d2cef69dbb4e1da9;hp=221c650f422871ce86255b332ab3f0f199d89fd6;hb=5dc7e62b19dbb8a8c9187ac5f182e671ab08a71d;hpb=7e88247ed52c190d3e14ac3d4aeb343a07e19607 diff --git a/hash.c b/hash.c index 221c650..bc65b7f 100644 --- a/hash.c +++ b/hash.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 + * Copyright (C) 2012, 2013, 2014 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -118,7 +118,6 @@ static GMQCC_FORCEINLINE uint32_t hash_murmur_mix32(uint32_t hash) { H = HASH_ROTL32(H, 13); \ H = H * 5 + 0xE6546B64; \ } while (0) - #define HASH_MURMUR_BYTES(COUNT, H, C, N, PTR, LENGTH) \ do { \ int i = COUNT; \ @@ -132,6 +131,13 @@ static GMQCC_FORCEINLINE uint32_t hash_murmur_mix32(uint32_t hash) { } \ } \ } while (0) +#define HASH_MURMUR_TAIL(P, Z, H, C, N, PTR, LEN) \ + do { \ + LEN -= LEN/4*4; \ + HASH_MURMUR_BYTES(LEN, H, C, N, PTR, LEN); \ + *P = H; \ + *Z = ((C) & ~0xFF) | (N); \ + } while (0) #if PLATFORM_BYTE_ORDER == GMQCC_BYTE_ORDER_LITTLE static GMQCC_FORCEINLINE void hash_murmur_process(uint32_t *ph1, uint32_t *carry, const void *key, int length) { @@ -151,13 +157,7 @@ static GMQCC_FORCEINLINE void hash_murmur_process(uint32_t *ph1, uint32_t *carry uint32_t k1 = HASH_MURMUR_SAFEREAD(ptr); HASH_MURMUR_BLOCK(h1, k1); } - - length -= length/4*4; - - HASH_MURMUR_BYTES(length, h1, c, n, ptr, length); - - *ph1 = h1; - *carry = (c & ~0xFF) | n; + HASH_MURMUR_TAIL(ph1, carry, h1, c, n, ptr, length); } #else static GMQCC_FORCEINLINE void hash_murmur_process(uint32_t *ph1, uint32_t *carry, const void *key, int length) { @@ -196,12 +196,7 @@ static GMQCC_FORCEINLINE void hash_murmur_process(uint32_t *ph1, uint32_t *carry NEXT(3, 8, 24); #undef NEXT } - length -= length/4*4; - - HASH_MURMUR_BYTES(length, h1, c, n, ptr, length); - - *ph1 = h1; - *carry = (c & ~0xFF) | n; + HASH_MURMUR_TAIL(ph1, carry, h1, c, n, ptr, length); } #endif @@ -242,3 +237,12 @@ size_t hash(const char *key) { return hash_murmur((const void *)key, s-a); } + +#undef HASH_ROTL32 +#undef HASH_MURMUR_MASK1 +#undef HASH_MURMUR_MASK2 +#undef HASH_MURMUR_SEED +#undef HASH_MURMUR_SAFEREAD +#undef HASH_MURMUR_BLOCK +#undef HASH_MURMUR_BYTES +#undef HASH_MURMUR_TAIL