Use locale agnostic tolower() in dict.c hash function.

This commit is contained in:
antirez
2017-02-20 17:39:44 +01:00
parent 05ea8c6122
commit 84fa8230e5
3 changed files with 27 additions and 17 deletions

View File

@ -40,6 +40,16 @@
#include <string.h>
#include <ctype.h>
/* Fast tolower() alike function that does not care about locale
* but just returns a-z insetad of A-Z. */
int siptlw(int c) {
if (c >= 'A' && c <= 'Z') {
return c+('a'-'A');
} else {
return c;
}
}
/* Test of the CPU is Little Endian and supports not aligned accesses.
* Two interesting conditions to speedup the function that happen to be
* in most of x86 servers. */
@ -70,14 +80,14 @@
#endif
#define U8TO64_LE_NOCASE(p) \
(((uint64_t)(tolower((p)[0]))) | \
((uint64_t)(tolower((p)[1])) << 8) | \
((uint64_t)(tolower((p)[2])) << 16) | \
((uint64_t)(tolower((p)[3])) << 24) | \
((uint64_t)(tolower((p)[4])) << 32) | \
((uint64_t)(tolower((p)[5])) << 40) | \
((uint64_t)(tolower((p)[6])) << 48) | \
((uint64_t)(tolower((p)[7])) << 56))
(((uint64_t)(siptlw((p)[0]))) | \
((uint64_t)(siptlw((p)[1])) << 8) | \
((uint64_t)(siptlw((p)[2])) << 16) | \
((uint64_t)(siptlw((p)[3])) << 24) | \
((uint64_t)(siptlw((p)[4])) << 32) | \
((uint64_t)(siptlw((p)[5])) << 40) | \
((uint64_t)(siptlw((p)[6])) << 48) | \
((uint64_t)(siptlw((p)[7])) << 56))
#define SIPROUND \
do { \
@ -192,13 +202,13 @@ uint64_t siphash_nocase(const uint8_t *in, const size_t inlen, const uint8_t *k)
}
switch (left) {
case 7: b |= ((uint64_t)tolower(in[6])) << 48;
case 6: b |= ((uint64_t)tolower(in[5])) << 40;
case 5: b |= ((uint64_t)tolower(in[4])) << 32;
case 4: b |= ((uint64_t)tolower(in[3])) << 24;
case 3: b |= ((uint64_t)tolower(in[2])) << 16;
case 2: b |= ((uint64_t)tolower(in[1])) << 8;
case 1: b |= ((uint64_t)tolower(in[0])); break;
case 7: b |= ((uint64_t)siptlw(in[6])) << 48;
case 6: b |= ((uint64_t)siptlw(in[5])) << 40;
case 5: b |= ((uint64_t)siptlw(in[4])) << 32;
case 4: b |= ((uint64_t)siptlw(in[3])) << 24;
case 3: b |= ((uint64_t)siptlw(in[2])) << 16;
case 2: b |= ((uint64_t)siptlw(in[1])) << 8;
case 1: b |= ((uint64_t)siptlw(in[0])); break;
case 0: break;
}