56 lines · c
1/* SPDX-License-Identifier: LGPL-2.12 *3 * Based on Paul Hsieh's (LGPG 2.1) hash function4 * From: http://www.azillionmonkeys.com/qed/hash.html5 */6 7#define get16bits(d) (*((const __u16 *) (d)))8 9static __always_inline10__u32 SuperFastHash (const char *data, int len, __u32 initval) {11 __u32 hash = initval;12 __u32 tmp;13 int rem;14 15 if (len <= 0 || data == NULL) return 0;16 17 rem = len & 3;18 len >>= 2;19 20 /* Main loop */21#pragma clang loop unroll(full)22 for (;len > 0; len--) {23 hash += get16bits (data);24 tmp = (get16bits (data+2) << 11) ^ hash;25 hash = (hash << 16) ^ tmp;26 data += 2*sizeof (__u16);27 hash += hash >> 11;28 }29 30 /* Handle end cases */31 switch (rem) {32 case 3: hash += get16bits (data);33 hash ^= hash << 16;34 hash ^= ((signed char)data[sizeof (__u16)]) << 18;35 hash += hash >> 11;36 break;37 case 2: hash += get16bits (data);38 hash ^= hash << 11;39 hash += hash >> 17;40 break;41 case 1: hash += (signed char)*data;42 hash ^= hash << 10;43 hash += hash >> 1;44 }45 46 /* Force "avalanching" of final 127 bits */47 hash ^= hash << 3;48 hash += hash >> 5;49 hash ^= hash << 4;50 hash += hash >> 17;51 hash ^= hash << 25;52 hash += hash >> 6;53 54 return hash;55}56