xref: /aosp_15_r20/external/trace-cmd/lib/trace-cmd/include/trace-hash-local.h (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
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 Worker static 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 Worker static 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