Keep hashing '\0' until color is not black

Actually uses the rest of the hash state this way.
weechat-hashes
Curtis McEnroe 2018-08-14 14:04:20 -04:00
parent ed9961410e
commit 398f752322
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
1 changed files with 11 additions and 5 deletions

View File

@ -25,16 +25,22 @@
#include "chat.h"
// Adapted from <https://github.com/cbreeden/fxhash/blob/master/lib.rs>.
static uint32_t hashChar(uint32_t hash, char ch) {
hash = (hash << 5) | (hash >> 27);
hash ^= ch;
hash *= 0x27220A95;
return hash;
}
static int color(const char *str) {
if (!str) return IRC_GRAY;
uint32_t hash = 0;
for (; str[0]; ++str) {
hash = (hash << 5) | (hash >> 27);
hash ^= str[0];
hash *= 0x27220A95;
hash = hashChar(hash, str[0]);
}
hash &= IRC_LIGHT_GRAY;
return (hash == IRC_BLACK) ? IRC_GRAY : hash;
while (IRC_BLACK == (hash & IRC_LIGHT_GRAY)) {
hash = hashChar(hash, '\0');
}
return (hash & IRC_LIGHT_GRAY);
}
static char *paramField(char **params) {