static guint
rspamd_icase_hash (const gchar *in, gsize len)
{
- guint leftover = len % 8;
+ guint leftover = len % 4;
guint fp, i;
const uint8_t* s = (const uint8_t*) in;
union {
- guchar c1, c2, c3, c4;
+ struct {
+ guchar c1, c2, c3, c4;
+ } c;
guint32 pp;
} u;
XXH64_state_t st;
XXH64_reset (&st, 0xdeadbabe);
for (i = 0; i != fp; i += 4) {
- u.c1 = s[i], u.c2 = s[i + 1], u.c3 = s[i + 2], u.c4 = s[i + 3];
- u.c1 = lc_map[u.c1];
- u.c2 = lc_map[u.c2];
- u.c3 = lc_map[u.c3];
- u.c4 = lc_map[u.c4];
+ u.c.c1 = s[i], u.c.c2 = s[i + 1], u.c.c3 = s[i + 2], u.c.c4 = s[i + 3];
+ u.c.c1 = lc_map[u.c.c1];
+ u.c.c2 = lc_map[u.c.c2];
+ u.c.c3 = lc_map[u.c.c3];
+ u.c.c4 = lc_map[u.c.c4];
XXH64_update (&st, &u.pp, sizeof (u));
}
u.pp = 0;
switch (leftover) {
case 3:
- u.c3 = lc_map[(guchar)s[i++]];
+ u.c.c3 = lc_map[(guchar)s[i++]];
case 2:
- u.c2 = lc_map[(guchar)s[i++]];
+ u.c.c2 = lc_map[(guchar)s[i++]];
case 1:
- u.c1 = lc_map[(guchar)s[i]];
- XXH64_update (&st, &u.pp, sizeof (u));
+ u.c.c1 = lc_map[(guchar)s[i]];
+ XXH64_update (&st, &u.pp, leftover);
break;
}