xref: /aosp_15_r20/external/libnl/include/netlink/hash.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /*
2*4dc78e53SAndroid Build Coastguard Worker  * This file was taken from http://ccodearchive.net/info/hash.html
3*4dc78e53SAndroid Build Coastguard Worker  * Changes to the original file include cleanups and removal of unwanted code
4*4dc78e53SAndroid Build Coastguard Worker  * and also code that depended on build_asert
5*4dc78e53SAndroid Build Coastguard Worker  */
6*4dc78e53SAndroid Build Coastguard Worker #ifndef CCAN_HASH_H
7*4dc78e53SAndroid Build Coastguard Worker #define CCAN_HASH_H
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <stdint.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <stdlib.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <endian.h>
12*4dc78e53SAndroid Build Coastguard Worker 
13*4dc78e53SAndroid Build Coastguard Worker /* Stolen mostly from: lookup3.c, by Bob Jenkins, May 2006, Public Domain.
14*4dc78e53SAndroid Build Coastguard Worker  *
15*4dc78e53SAndroid Build Coastguard Worker  * http://burtleburtle.net/bob/c/lookup3.c
16*4dc78e53SAndroid Build Coastguard Worker  */
17*4dc78e53SAndroid Build Coastguard Worker 
18*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
19*4dc78e53SAndroid Build Coastguard Worker extern "C" {
20*4dc78e53SAndroid Build Coastguard Worker #endif
21*4dc78e53SAndroid Build Coastguard Worker 
22*4dc78e53SAndroid Build Coastguard Worker #ifdef __LITTLE_ENDIAN
23*4dc78e53SAndroid Build Coastguard Worker #   define HAVE_LITTLE_ENDIAN 1
24*4dc78e53SAndroid Build Coastguard Worker #elif __BIG_ENDIAN
25*4dc78e53SAndroid Build Coastguard Worker #   define HAVE_BIG_ENDIAN 1
26*4dc78e53SAndroid Build Coastguard Worker #else
27*4dc78e53SAndroid Build Coastguard Worker #error Unknown endianness.  Failure in endian.h
28*4dc78e53SAndroid Build Coastguard Worker #endif
29*4dc78e53SAndroid Build Coastguard Worker 
30*4dc78e53SAndroid Build Coastguard Worker /**
31*4dc78e53SAndroid Build Coastguard Worker  * hash - fast hash of an array for internal use
32*4dc78e53SAndroid Build Coastguard Worker  * @p: the array or pointer to first element
33*4dc78e53SAndroid Build Coastguard Worker  * @num: the number of elements to hash
34*4dc78e53SAndroid Build Coastguard Worker  * @base: the base number to roll into the hash (usually 0)
35*4dc78e53SAndroid Build Coastguard Worker  *
36*4dc78e53SAndroid Build Coastguard Worker  * The memory region pointed to by p is combined with the base to form
37*4dc78e53SAndroid Build Coastguard Worker  * a 32-bit hash.
38*4dc78e53SAndroid Build Coastguard Worker  *
39*4dc78e53SAndroid Build Coastguard Worker  * This hash will have different results on different machines, so is
40*4dc78e53SAndroid Build Coastguard Worker  * only useful for internal hashes (ie. not hashes sent across the
41*4dc78e53SAndroid Build Coastguard Worker  * network or saved to disk).
42*4dc78e53SAndroid Build Coastguard Worker  *
43*4dc78e53SAndroid Build Coastguard Worker  * It may also change with future versions: it could even detect at runtime
44*4dc78e53SAndroid Build Coastguard Worker  * what the fastest hash to use is.
45*4dc78e53SAndroid Build Coastguard Worker  *
46*4dc78e53SAndroid Build Coastguard Worker  * See also: hash64, hash_stable.
47*4dc78e53SAndroid Build Coastguard Worker  *
48*4dc78e53SAndroid Build Coastguard Worker  * Example:
49*4dc78e53SAndroid Build Coastguard Worker  *	#include <ccan/hash/hash.h>
50*4dc78e53SAndroid Build Coastguard Worker  *	#include <err.h>
51*4dc78e53SAndroid Build Coastguard Worker  *	#include <stdio.h>
52*4dc78e53SAndroid Build Coastguard Worker  *	#include <string.h>
53*4dc78e53SAndroid Build Coastguard Worker  *
54*4dc78e53SAndroid Build Coastguard Worker  *	// Simple demonstration: idential strings will have the same hash, but
55*4dc78e53SAndroid Build Coastguard Worker  *	// two different strings will probably not.
56*4dc78e53SAndroid Build Coastguard Worker  *	int main(int argc, char *argv[])
57*4dc78e53SAndroid Build Coastguard Worker  *	{
58*4dc78e53SAndroid Build Coastguard Worker  *		uint32_t hash1, hash2;
59*4dc78e53SAndroid Build Coastguard Worker  *
60*4dc78e53SAndroid Build Coastguard Worker  *		if (argc != 3)
61*4dc78e53SAndroid Build Coastguard Worker  *			err(1, "Usage: %s <string1> <string2>", argv[0]);
62*4dc78e53SAndroid Build Coastguard Worker  *
63*4dc78e53SAndroid Build Coastguard Worker  *		hash1 = __nl_hash(argv[1], strlen(argv[1]), 0);
64*4dc78e53SAndroid Build Coastguard Worker  *		hash2 = __nl_hash(argv[2], strlen(argv[2]), 0);
65*4dc78e53SAndroid Build Coastguard Worker  *		printf("Hash is %s\n", hash1 == hash2 ? "same" : "different");
66*4dc78e53SAndroid Build Coastguard Worker  *		return 0;
67*4dc78e53SAndroid Build Coastguard Worker  *	}
68*4dc78e53SAndroid Build Coastguard Worker  */
69*4dc78e53SAndroid Build Coastguard Worker #define __nl_hash(p, num, base) nl_hash_any((p), (num)*sizeof(*(p)), (base))
70*4dc78e53SAndroid Build Coastguard Worker 
71*4dc78e53SAndroid Build Coastguard Worker /* Our underlying operations. */
72*4dc78e53SAndroid Build Coastguard Worker uint32_t nl_hash_any(const void *key, size_t length, uint32_t base);
73*4dc78e53SAndroid Build Coastguard Worker 
74*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
75*4dc78e53SAndroid Build Coastguard Worker }
76*4dc78e53SAndroid Build Coastguard Worker #endif
77*4dc78e53SAndroid Build Coastguard Worker 
78*4dc78e53SAndroid Build Coastguard Worker #endif /* HASH_H */
79