fzy
terminal fuzzy finder picker
git clone https://9o.is/git/fzy.git
theft_hash.c
(1181B)
1 #include "theft.h"
2
3 /* Fowler/Noll/Vo hash, 64-bit FNV-1a.
4 * This hashing algorithm is in the public domain.
5 * For more details, see: http://www.isthe.com/chongo/tech/comp/fnv/. */
6 static const uint64_t fnv64_prime = 1099511628211L;
7 static const uint64_t fnv64_offset_basis = 14695981039346656037UL;
8
9 /* Init a hasher for incremental hashing. */
10 void theft_hash_init(struct theft_hasher *h) {
11 h->accum = fnv64_offset_basis;
12 }
13
14 /* Sink more data into an incremental hash. */
15 void theft_hash_sink(struct theft_hasher *h, uint8_t *data, size_t bytes) {
16 if (h == NULL || data == NULL) { return; }
17 uint64_t a = h->accum;
18 for (size_t i = 0; i < bytes; i++) {
19 a = (a ^ data[i]) * fnv64_prime;
20 }
21 h->accum = a;
22 }
23
24 /* Finish hashing and get the result. */
25 theft_hash theft_hash_done(struct theft_hasher *h) {
26 theft_hash res = h->accum;
27 theft_hash_init(h); /* reset */
28 return res;
29 }
30
31 /* Hash a buffer in one pass. (Wraps the above functions.) */
32 theft_hash theft_hash_onepass(uint8_t *data, size_t bytes) {
33 struct theft_hasher h;
34 theft_hash_init(&h);
35 theft_hash_sink(&h, data, bytes);
36 return theft_hash_done(&h);
37 }