--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/Writerside/topics/hash_key.h.md Tue Feb 11 19:55:32 2025 +0100 @@ -0,0 +1,50 @@ +# Hash Function + +UCX implements the MurmurHash2 algorithm for computing hashes that are primarily used for [CxMap](map.h.md). +But it can be used for arbitrary custom scenarios, too. + +## Overview +```C +#include <cx/hash_key.h> + +void cx_hash_murmur(CxHashKey *key); +CxHashKey cx_hash_key(const void *obj, size_t len); +CxHashKey cx_hash_key_str(const char *str); +CxHashKey cx_hash_key_bytes(const unsigned char *bytes, size_t len); +CxHashKey cx_hash_key_cxstr(cxstring str); +``` + +## Description + +The primary function for creating a `CxHashKey` structure is `cx_hash_key()`. +The other functions do effectively the same, but + +* `cx_hash_key_bytes()` is strongly typed if you want to avoid passing `void*` +* `cx_hash_key_str()` conveniently takes a C string and computes the length +* `cx_hash_key_cxstr()` conveniently takes a [UCX string](string.h.md) + +In all cases, the hash will be available in the `hash` field of the returned structure. + +<note> +UCX assigns the hash value <code>1574210520</code> to the <code>NULL</code> pointer. +This is a careful choice which is not standard MurmurHash2 and an extension to support <code>NULL</code> pointers. +</note> + +If you want to create a hash completely manually, +you can initialize the `data` and `len` members of `CxHashKey` +and call `cx_hash_murmur()`. +It is _not_ recommended to do so. + +Example that is equivalent to `CxHashKey key = cx_hash_str(mystring)` +```C +CxHashKey key; +key.data = mystring; +key.len = strlen(mystring); +cx_hash_murmur(&key); +``` + +<seealso> +<category ref="apidoc"> +<a href="https://ucx.sourceforge.io/api/hash__key_8h.html">hash_key.h</a> +</category> +</seealso> \ No newline at end of file