### The `chash` module contains functions for consistent hashing of values. ### This can be used to achieve consistent routing over multiple outputs. ## Hashes an input key (string) and determine its placement in a slot list. ## ## For example It can be used to pick a routing destination using an array of ## hosts: ## ## > ```tremor ## > use tremor::chash; ## > let hosts = ["host1", "host2", "host3", "host4", "host5"]; ## > { ## > "key1": hosts[chash::jump("key1", array::len(hosts))], ## > "key1_again": hosts[chash::jump("key1", array::len(hosts))], ## > "key2": hosts[chash::jump("key2", array::len(hosts))], ## > "key3": hosts[chash::jump("key3", array::len(hosts))], ## > "key4": hosts[chash::jump("key4", array::len(hosts))], ## > } ## > ``` ## ## Returns an `integer`. intrinsic fn jump(key, slot_count) as chash::jump; ## The same as chash::jump but uses the integers k1 and k2 to initialise the ## hashing instead of using default values. ## ## > ```tremor ## > use tremor::chash; ## > let hosts = ["host1", "host2", "host3", "host4", "host5"]; ## > { ## > "key1": hosts[chash::jump_with_keys(7, 42, "key1", array::len(hosts))], ## > "key1_again": hosts[chash::jump_with_keys(7, 42, "key1", array::len(hosts))], ## > "key2": hosts[chash::jump_with_keys(7, 42, "key2", array::len(hosts))], ## > "key3": hosts[chash::jump_with_keys(7, 42, "key3", array::len(hosts))], ## > "key4": hosts[chash::jump_with_keys(7, 42, "key4", array::len(hosts))], ## > } ## > ``` ## ## Returns an `integer` intrinsic fn jump_with_keys(k1, k2, key, slot_count) as chash::jump_with_keys; ## Serialises the given data in a sorted and repeatable fashion no matter how ## data is internally stored. In comparison, the normal serialisation functions ## do not ensure order for performance reasons. Their behaviour is well suited ## for encoding data on the wire, but in the context of consistent hashing we ## need to guarantee that data is always encoded to the same serialisation on a ## byte level not only on the logical level ## ## > ```tremor ## > use tremor::chash; ## > { ## > "s1": chash::sorted_serialize("snot"), ## > # Arrays serialize preserving element order ## > "s2": chash::sorted_serialize(["badger", "snot"]), ## > "s3": chash::sorted_serialize(["snot", "badger"]), ## > # Records serialize *normalizing* field element order ## > "s4": chash::sorted_serialize({ "badger": "snot", "snot": "badger"}), ## > "s5": chash::sorted_serialize({ "snot": "badger", "badger": "snot"}), ## > } ## ## Returns an `string` intrinsic fn sorted_serialize(any) as chash::sorted_serialize;