1*58e6ee5fSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */ 2*58e6ee5fSAndroid Build Coastguard Worker /* 3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2009, Steven Rostedt <[email protected]> 4*58e6ee5fSAndroid Build Coastguard Worker * 5*58e6ee5fSAndroid Build Coastguard Worker */ 6*58e6ee5fSAndroid Build Coastguard Worker #ifndef _TRACE_HASH_LOCAL_H 7*58e6ee5fSAndroid Build Coastguard Worker #define _TRACE_HASH_LOCAL_H 8*58e6ee5fSAndroid Build Coastguard Worker trace_hash(unsigned int val)9*58e6ee5fSAndroid Build Coastguard Workerstatic inline unsigned int trace_hash(unsigned int val) 10*58e6ee5fSAndroid Build Coastguard Worker { 11*58e6ee5fSAndroid Build Coastguard Worker unsigned int hash, tmp; 12*58e6ee5fSAndroid Build Coastguard Worker 13*58e6ee5fSAndroid Build Coastguard Worker hash = 12546869; /* random prime */ 14*58e6ee5fSAndroid Build Coastguard Worker 15*58e6ee5fSAndroid Build Coastguard Worker /* 16*58e6ee5fSAndroid Build Coastguard Worker * The following hash is based off of Paul Hsieh's super fast hash: 17*58e6ee5fSAndroid Build Coastguard Worker * http://www.azillionmonkeys.com/qed/hash.html 18*58e6ee5fSAndroid Build Coastguard Worker * Note, he released this code unde the GPL 2.0 license, which 19*58e6ee5fSAndroid Build Coastguard Worker * is the same as the license for the programs that use it here. 20*58e6ee5fSAndroid Build Coastguard Worker */ 21*58e6ee5fSAndroid Build Coastguard Worker 22*58e6ee5fSAndroid Build Coastguard Worker hash += (val & 0xffff); 23*58e6ee5fSAndroid Build Coastguard Worker tmp = (val >> 16) ^ hash; 24*58e6ee5fSAndroid Build Coastguard Worker hash = (hash << 16) ^ tmp; 25*58e6ee5fSAndroid Build Coastguard Worker hash += hash >> 11; 26*58e6ee5fSAndroid Build Coastguard Worker 27*58e6ee5fSAndroid Build Coastguard Worker hash ^= hash << 3; 28*58e6ee5fSAndroid Build Coastguard Worker hash += hash >> 5; 29*58e6ee5fSAndroid Build Coastguard Worker hash ^= hash << 4; 30*58e6ee5fSAndroid Build Coastguard Worker hash += hash >> 17; 31*58e6ee5fSAndroid Build Coastguard Worker hash ^= hash << 25; 32*58e6ee5fSAndroid Build Coastguard Worker hash += hash >> 6; 33*58e6ee5fSAndroid Build Coastguard Worker 34*58e6ee5fSAndroid Build Coastguard Worker return hash; 35*58e6ee5fSAndroid Build Coastguard Worker } 36*58e6ee5fSAndroid Build Coastguard Worker trace_hash_str(char * str)37*58e6ee5fSAndroid Build Coastguard Workerstatic inline unsigned int trace_hash_str(char *str) 38*58e6ee5fSAndroid Build Coastguard Worker { 39*58e6ee5fSAndroid Build Coastguard Worker int val = 0; 40*58e6ee5fSAndroid Build Coastguard Worker int i; 41*58e6ee5fSAndroid Build Coastguard Worker 42*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; str[i]; i++) 43*58e6ee5fSAndroid Build Coastguard Worker val += ((int)str[i]) << (i & 0xf); 44*58e6ee5fSAndroid Build Coastguard Worker return trace_hash(val); 45*58e6ee5fSAndroid Build Coastguard Worker } 46*58e6ee5fSAndroid Build Coastguard Worker #endif /* _TRACE_HASH_LOCAL_H */ 47