1#pragma once
2
3#include <cstdint>
4#include <cstddef>
5
6/*
7 * Author: Konstantin Oblakov
8 *
9 * Maps random ui64 x (in fact hash of some string) to n baskets/shards.
10 * Output value is id of a basket. 0 <= ConsistentHashing(x, n) < n.
11 * Probability of all baskets must be equal. Also, it should be consistent
12 * in terms, that with different n_1 < n_2 probability of
13 * ConsistentHashing(x, n_1) != ConsistentHashing(x, n_2) must be equal to
14 * (n_2 - n_1) / n_2 - the least possible with previous conditions.
15 * It requires O(1) memory and cpu to calculate. So, it is faster than classic
16 * consistent hashing algos with points on circle.
17 */
18std::size_t ConsistentHashing(std::uint64_t x, std::size_t n); // Works for n <= 32768
19std::size_t ConsistentHashing(std::uint64_t lo, std::uint64_t hi, std::size_t n); // Works for n <= 2^31
20