Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_HASH_H |
| 2 | #define _LINUX_HASH_H |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 3 | /* Fast hashing routine for ints, longs and pointers. |
Nadia Yvette Chambers | 6d49e35 | 2012-12-06 10:39:54 +0100 | [diff] [blame] | 4 | (C) 2002 Nadia Yvette Chambers, IBM */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 | |
| 6 | /* |
| 7 | * Knuth recommends primes in approximately golden ratio to the maximum |
| 8 | * integer representable by a machine word for multiplicative hashing. |
| 9 | * Chuck Lever verified the effectiveness of this technique: |
| 10 | * http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf |
| 11 | * |
| 12 | * These primes are chosen to be bit-sparse, that is operations on |
| 13 | * them can use shifts and additions instead of multiplications for |
| 14 | * machines where multiplications are slow. |
| 15 | */ |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 16 | |
| 17 | #include <asm/types.h> |
Francesco Fusco | 71ae8aa | 2013-12-12 16:09:05 +0100 | [diff] [blame] | 18 | #include <asm/hash.h> |
Masami Hiramatsu | 65c1055 | 2013-03-14 20:52:30 +0900 | [diff] [blame] | 19 | #include <linux/compiler.h> |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 20 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 21 | /* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */ |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 22 | #define GOLDEN_RATIO_PRIME_32 0x9e370001UL |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 | /* 2^63 + 2^61 - 2^57 + 2^54 - 2^51 - 2^18 + 1 */ |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 24 | #define GOLDEN_RATIO_PRIME_64 0x9e37fffffffc0001UL |
| 25 | |
| 26 | #if BITS_PER_LONG == 32 |
| 27 | #define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_32 |
| 28 | #define hash_long(val, bits) hash_32(val, bits) |
| 29 | #elif BITS_PER_LONG == 64 |
| 30 | #define hash_long(val, bits) hash_64(val, bits) |
| 31 | #define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_64 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 | #else |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 33 | #error Wordsize not 32 or 64 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | #endif |
| 35 | |
Masami Hiramatsu | 65c1055 | 2013-03-14 20:52:30 +0900 | [diff] [blame] | 36 | static __always_inline u64 hash_64(u64 val, unsigned int bits) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 37 | { |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 38 | u64 hash = val; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 39 | |
Linus Torvalds | 23d0db7 | 2014-09-13 11:24:03 -0700 | [diff] [blame] | 40 | #if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64 |
| 41 | hash = hash * GOLDEN_RATIO_PRIME_64; |
| 42 | #else |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 43 | /* Sigh, gcc can't optimise this alone like it does for 32 bits. */ |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 44 | u64 n = hash; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | n <<= 18; |
| 46 | hash -= n; |
| 47 | n <<= 33; |
| 48 | hash -= n; |
| 49 | n <<= 3; |
| 50 | hash += n; |
| 51 | n <<= 3; |
| 52 | hash -= n; |
| 53 | n <<= 4; |
| 54 | hash += n; |
| 55 | n <<= 2; |
| 56 | hash += n; |
Linus Torvalds | 23d0db7 | 2014-09-13 11:24:03 -0700 | [diff] [blame] | 57 | #endif |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 58 | |
| 59 | /* High bits are more random, so use them. */ |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 60 | return hash >> (64 - bits); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | } |
Matthew Wilcox | 4e70148 | 2008-02-06 01:36:14 -0800 | [diff] [blame] | 62 | |
| 63 | static inline u32 hash_32(u32 val, unsigned int bits) |
| 64 | { |
| 65 | /* On some cpus multiply is faster, on others gcc will do shifts */ |
| 66 | u32 hash = val * GOLDEN_RATIO_PRIME_32; |
| 67 | |
| 68 | /* High bits are more random, so use them. */ |
| 69 | return hash >> (32 - bits); |
| 70 | } |
| 71 | |
Ian Campbell | f991879 | 2011-08-17 13:45:09 +0100 | [diff] [blame] | 72 | static inline unsigned long hash_ptr(const void *ptr, unsigned int bits) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 | { |
| 74 | return hash_long((unsigned long)ptr, bits); |
| 75 | } |
Pavel Emelyanov | b14f243 | 2012-08-08 21:52:28 +0000 | [diff] [blame] | 76 | |
| 77 | static inline u32 hash32_ptr(const void *ptr) |
| 78 | { |
| 79 | unsigned long val = (unsigned long)ptr; |
| 80 | |
| 81 | #if BITS_PER_LONG == 64 |
| 82 | val ^= (val >> 32); |
| 83 | #endif |
| 84 | return (u32)val; |
| 85 | } |
Francesco Fusco | 71ae8aa | 2013-12-12 16:09:05 +0100 | [diff] [blame] | 86 | |
| 87 | struct fast_hash_ops { |
| 88 | u32 (*hash)(const void *data, u32 len, u32 seed); |
| 89 | u32 (*hash2)(const u32 *data, u32 len, u32 seed); |
| 90 | }; |
| 91 | |
| 92 | /** |
| 93 | * arch_fast_hash - Caclulates a hash over a given buffer that can have |
| 94 | * arbitrary size. This function will eventually use an |
| 95 | * architecture-optimized hashing implementation if |
| 96 | * available, and trades off distribution for speed. |
| 97 | * |
| 98 | * @data: buffer to hash |
| 99 | * @len: length of buffer in bytes |
| 100 | * @seed: start seed |
| 101 | * |
| 102 | * Returns 32bit hash. |
| 103 | */ |
| 104 | extern u32 arch_fast_hash(const void *data, u32 len, u32 seed); |
| 105 | |
| 106 | /** |
| 107 | * arch_fast_hash2 - Caclulates a hash over a given buffer that has a |
| 108 | * size that is of a multiple of 32bit words. This |
| 109 | * function will eventually use an architecture- |
| 110 | * optimized hashing implementation if available, |
| 111 | * and trades off distribution for speed. |
| 112 | * |
| 113 | * @data: buffer to hash (must be 32bit padded) |
| 114 | * @len: number of 32bit words |
| 115 | * @seed: start seed |
| 116 | * |
| 117 | * Returns 32bit hash. |
| 118 | */ |
| 119 | extern u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed); |
| 120 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 | #endif /* _LINUX_HASH_H */ |