| 1234567891011121314151617181920212223242526272829303132333435363738 |
- #ifndef HASH_H
- #define HASH_H
- #include <stdint.h>
- #include <stdlib.h>
- typedef char byte_t;
- __attribute__((access (read_only, 1), nonnull, pure))
- uint64_t hash(const byte_t* data, size_t size);
- #if defined(HASH_IMP) || defined(IMPLEMENTATIONS)
- uint64_t hash(const byte_t* data, size_t size) {
- static uint8_t _primes_list[] = {
- 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
- 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
- 131, 137, 139, 149, 151, 157, 163, 167, 173
- };
- static uint8_t _primes_list_size = 10;
- uint64_t max = UINT64_MAX >> 1;
- uint64_t ret = 1;
- uint8_t p = 0;
- size_t i = 0;
- byte_t b = 0;
- for ( i = 0; i < size; ++i ) {
- b = data[i];
- p = _primes_list[(i + b) % _primes_list_size];
- ret = (ret * (b * p)) % max;
- }
- return ret;
- }
- #endif /* HASH_IMP || IMPLEMENTATIONS */
- #endif
|