File size: 907 Bytes
287a0bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from chromadb.utils.rendezvous_hash import assign, murmur3hasher


def test_rendezvous_hash() -> None:
    # Tests the assign works as expected
    members = ["a", "b", "c"]
    key = "key"

    def mock_hasher(member: str, key: str) -> int:
        return members.index(member)  # Highest index wins

    assert assign(key, members, mock_hasher) == "c"


def test_even_distribution() -> None:
    member_count = 10
    tolerance = 25
    nodes = [str(i) for i in range(member_count)]

    # Test if keys are evenly distributed across nodes
    key_distribution = {node: 0 for node in nodes}
    num_keys = 1000
    for i in range(num_keys):
        key = f"key_{i}"
        node = assign(key, nodes, murmur3hasher)
        key_distribution[node] += 1

    # Check if keys are somewhat evenly distributed
    for node in nodes:
        assert abs(key_distribution[node] - num_keys / len(nodes)) < tolerance