mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Add inline murmurhash32(uint32) function.
The function already existed in tidbitmap.c but more users requiring fast hashing of 32bit ints are coming up. Author: Andres Freund Discussion: https://postgr.es/m/20170914061207.zxotvyopetm7lrrp@alap3.anarazel.de
This commit is contained in:
parent
91ad8b416c
commit
791961f59b
@ -45,6 +45,7 @@
|
|||||||
#include "nodes/tidbitmap.h"
|
#include "nodes/tidbitmap.h"
|
||||||
#include "storage/lwlock.h"
|
#include "storage/lwlock.h"
|
||||||
#include "utils/dsa.h"
|
#include "utils/dsa.h"
|
||||||
|
#include "utils/hashutils.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum number of tuples per page is not large (typically 256 with
|
* The maximum number of tuples per page is not large (typically 256 with
|
||||||
@ -237,30 +238,13 @@ static int tbm_comparator(const void *left, const void *right);
|
|||||||
static int tbm_shared_comparator(const void *left, const void *right,
|
static int tbm_shared_comparator(const void *left, const void *right,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple inline murmur hash implementation for the exact width required, for
|
|
||||||
* performance.
|
|
||||||
*/
|
|
||||||
static inline uint32
|
|
||||||
hash_blockno(BlockNumber b)
|
|
||||||
{
|
|
||||||
uint32 h = b;
|
|
||||||
|
|
||||||
h ^= h >> 16;
|
|
||||||
h *= 0x85ebca6b;
|
|
||||||
h ^= h >> 13;
|
|
||||||
h *= 0xc2b2ae35;
|
|
||||||
h ^= h >> 16;
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* define hashtable mapping block numbers to PagetableEntry's */
|
/* define hashtable mapping block numbers to PagetableEntry's */
|
||||||
#define SH_USE_NONDEFAULT_ALLOCATOR
|
#define SH_USE_NONDEFAULT_ALLOCATOR
|
||||||
#define SH_PREFIX pagetable
|
#define SH_PREFIX pagetable
|
||||||
#define SH_ELEMENT_TYPE PagetableEntry
|
#define SH_ELEMENT_TYPE PagetableEntry
|
||||||
#define SH_KEY_TYPE BlockNumber
|
#define SH_KEY_TYPE BlockNumber
|
||||||
#define SH_KEY blockno
|
#define SH_KEY blockno
|
||||||
#define SH_HASH_KEY(tb, key) hash_blockno(key)
|
#define SH_HASH_KEY(tb, key) murmurhash32(key)
|
||||||
#define SH_EQUAL(tb, a, b) a == b
|
#define SH_EQUAL(tb, a, b) a == b
|
||||||
#define SH_SCOPE static inline
|
#define SH_SCOPE static inline
|
||||||
#define SH_DEFINE
|
#define SH_DEFINE
|
||||||
|
@ -20,4 +20,22 @@ hash_combine(uint32 a, uint32 b)
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple inline murmur hash implementation hashing a 32 bit ingeger, for
|
||||||
|
* performance.
|
||||||
|
*/
|
||||||
|
static inline uint32
|
||||||
|
murmurhash32(uint32 data)
|
||||||
|
{
|
||||||
|
uint32 h = data;
|
||||||
|
|
||||||
|
h ^= h >> 16;
|
||||||
|
h *= 0x85ebca6b;
|
||||||
|
h ^= h >> 13;
|
||||||
|
h *= 0xc2b2ae35;
|
||||||
|
h ^= h >> 16;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HASHUTILS_H */
|
#endif /* HASHUTILS_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user