mirror of
https://git.sr.ht/~cismonx/bookmarkfs
synced 2025-06-07 19:58:50 +00:00
doc: update docs for the utility library
Move documentation for the hash table from source code comments to the user manual.
This commit is contained in:
parent
c2a91d6420
commit
cadde0b61e
2 changed files with 236 additions and 42 deletions
|
@ -3731,6 +3731,242 @@ An opaque pointer to be passed to the @code{callback} function.
|
||||||
@node Hash Tables
|
@node Hash Tables
|
||||||
@section Hash Tables
|
@section Hash Tables
|
||||||
|
|
||||||
|
A simple hash table implementation, based on a variant of
|
||||||
|
@uref{https://en.wikipedia.org/wiki/Hopscotch_hashing, Hopscotch Hashing}.
|
||||||
|
|
||||||
|
Time complexity:
|
||||||
|
|
||||||
|
@multitable @columnfractions .33 .33 .33
|
||||||
|
@headitem Operation @tab Average @tab Worst case
|
||||||
|
@item Insert @tab @t{Θ(1)} @tab @t{O(n log n)}
|
||||||
|
@item Search @tab @t{Θ(1)} @tab @t{O(log n)}
|
||||||
|
@item Delete @tab @t{Θ(1)} @tab @t{O(log n)}
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item hashmap_create
|
||||||
|
Creates a new hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
#include <bookmarkfs/hashmap.h>
|
||||||
|
|
||||||
|
struct hashmap *
|
||||||
|
hashmap_create (
|
||||||
|
hashmap_comp_func *entry_comp,
|
||||||
|
hashmap_hash_func *entry_hash
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item entry_comp
|
||||||
|
The callback function for checking whether a key matches an entry.
|
||||||
|
|
||||||
|
Type of @code{entry_comp} is defined as:
|
||||||
|
|
||||||
|
@example c
|
||||||
|
typedef int (hashmap_comp_func) (
|
||||||
|
union hashmap_key key,
|
||||||
|
void const *entry
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
The function should return @t{0} if the objects match, non-zero if not.
|
||||||
|
|
||||||
|
@item entry_hash
|
||||||
|
The callback function for obtaining the hashcode for an entry.
|
||||||
|
|
||||||
|
Type of @code{entry_hash} is defined as:
|
||||||
|
|
||||||
|
@example c
|
||||||
|
typedef unsigned long (hashmap_hash_func) (
|
||||||
|
void const *entry
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This function is only called during rehashing and @code{hashmap_entry_delete}.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Returns an opaque pointer referring to the new hash table.
|
||||||
|
|
||||||
|
@item hashmap_insert
|
||||||
|
Inserts a new entry into a hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
void
|
||||||
|
hashmap_insert (
|
||||||
|
struct hashmap *map,
|
||||||
|
unsigned long hashcode,
|
||||||
|
void *entry
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item map
|
||||||
|
The hash table to insert entry into.
|
||||||
|
|
||||||
|
@item hashcode
|
||||||
|
The hash code for the new entry.
|
||||||
|
|
||||||
|
@item entry
|
||||||
|
An arbitrary pointer to be associated with the new entry.
|
||||||
|
It must not be @code{NULL}.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item hashmap_search
|
||||||
|
Searches for an entry in a hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
void *
|
||||||
|
hashmap_search (
|
||||||
|
struct hashmap const *map,
|
||||||
|
union hashmap_key key,
|
||||||
|
unsigned long hashcode,
|
||||||
|
unsigned long *entry_id_ptr
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item map
|
||||||
|
The hash table to search from.
|
||||||
|
|
||||||
|
@item key
|
||||||
|
An object to identify the entry being searched.
|
||||||
|
|
||||||
|
Type of the @code{hashmap_key} union is defined as:
|
||||||
|
|
||||||
|
@example c
|
||||||
|
union hashmap_key @{
|
||||||
|
void const *ptr;
|
||||||
|
uint64_t u64;
|
||||||
|
@};
|
||||||
|
@end example
|
||||||
|
|
||||||
|
For each entry in the hash table with the given @code{hashcode},
|
||||||
|
the @code{entry_comp} callback function is called with @code{key}
|
||||||
|
as the first argument, until a matching entry is found.
|
||||||
|
|
||||||
|
@item hashcode
|
||||||
|
The hash code for the entry to search.
|
||||||
|
|
||||||
|
@item entry_id_ptr
|
||||||
|
If not @code{NULL}, and a matching entry is found,
|
||||||
|
the function sets @code{*entry_id_ptr} to an opaque integer value,
|
||||||
|
which can be used to identify the entry when calling @code{hashmap_delete()}.
|
||||||
|
|
||||||
|
A subsequent call to @code{hashmap_insert()} and @code{hashmap_delete()}
|
||||||
|
on this hash table invalidates that value.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Returns the pointer associated with the entry,
|
||||||
|
or @code{NULL} if no matching entry is found.
|
||||||
|
|
||||||
|
@item hashmap_delete
|
||||||
|
Removes an entry from a hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
void
|
||||||
|
hashmap_delete (
|
||||||
|
struct hashmap *map,
|
||||||
|
void const *entry,
|
||||||
|
long entry_id
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item map
|
||||||
|
The hash table to delete entry from.
|
||||||
|
|
||||||
|
@item entry
|
||||||
|
The entry to be deleted from the hash table.
|
||||||
|
|
||||||
|
If the hash table does not contain this entry, function behavior is undefined.
|
||||||
|
|
||||||
|
@item entry_id
|
||||||
|
An opaque integer obtained from @code{hashmap_search()} which identifies
|
||||||
|
the entry to be deleted.
|
||||||
|
If not readily available, @t{-1} should be used.
|
||||||
|
|
||||||
|
If provided, the delete operation is always of @t{O(1)} time complexity.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item hashmap_foreach
|
||||||
|
Iterates through all entries of a hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
void
|
||||||
|
hashmap_foreach (
|
||||||
|
struct hashmap const *map,
|
||||||
|
hashmap_walk_func *walk_func,
|
||||||
|
void *user_data
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item map
|
||||||
|
The hash table to traverse.
|
||||||
|
|
||||||
|
@item walk_func
|
||||||
|
The callback function to be called for each entry.
|
||||||
|
|
||||||
|
Type of @code{walk_func} is defined as:
|
||||||
|
|
||||||
|
@example c
|
||||||
|
typedef void (hashmap_walk_func) (
|
||||||
|
void *entry,
|
||||||
|
void *user_data
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
The callback function must not insert to or delete from the current hash table.
|
||||||
|
|
||||||
|
@item user_data
|
||||||
|
An opaque pointer to be passed to @code{walk_func}.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item hashmap_destroy
|
||||||
|
Destroys a hash table.
|
||||||
|
|
||||||
|
@example c
|
||||||
|
void
|
||||||
|
hashmap_destroy (
|
||||||
|
struct hashmap *map
|
||||||
|
);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Function arguments:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item map
|
||||||
|
The hash table to destroy.
|
||||||
|
If @code{NULL}, this function has no effect.
|
||||||
|
@end table
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Limitations:
|
||||||
|
|
||||||
|
@itemize @bullet{}
|
||||||
|
@item Insertion performance is sacrificed in favor of search performance.
|
||||||
|
|
||||||
|
@item Suffers more from collisions than traditional open addressing.
|
||||||
|
|
||||||
|
@item Performance is suboptimal without hardware support for
|
||||||
|
@uref{https://en.wikipedia.org/wiki/Find_first_set, Find First Set}.
|
||||||
|
|
||||||
|
@item Concurrent writes on the same hash table is MT-Unsafe.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
@node Pseudo-Random Number Generator
|
@node Pseudo-Random Number Generator
|
||||||
@section Pseudo-Random Number Generator
|
@section Pseudo-Random Number Generator
|
||||||
|
|
|
@ -37,28 +37,15 @@ typedef void (hashmap_walk_func) (
|
||||||
void *entry
|
void *entry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtain the hashcode for an entry.
|
|
||||||
*
|
|
||||||
* This function is only called during rehash and entry delete.
|
|
||||||
*/
|
|
||||||
typedef unsigned long (hashmap_hash_func) (
|
typedef unsigned long (hashmap_hash_func) (
|
||||||
void const *entry
|
void const *entry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the given key matches an entry in the hashmap.
|
|
||||||
*
|
|
||||||
* Returns 0 if matches, non-zero if not.
|
|
||||||
*/
|
|
||||||
typedef int (hashmap_comp_func) (
|
typedef int (hashmap_comp_func) (
|
||||||
union hashmap_key key,
|
union hashmap_key key,
|
||||||
void const *entry
|
void const *entry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new hashmap with given callback functions.
|
|
||||||
*/
|
|
||||||
struct hashmap *
|
struct hashmap *
|
||||||
hashmap_create (
|
hashmap_create (
|
||||||
hashmap_comp_func *entry_comp,
|
hashmap_comp_func *entry_comp,
|
||||||
|
@ -70,10 +57,6 @@ hashmap_destroy (
|
||||||
struct hashmap *map
|
struct hashmap *map
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the walk_func callback to each entry in hashmap,
|
|
||||||
* passing user_data as its second argument.
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
hashmap_foreach (
|
hashmap_foreach (
|
||||||
struct hashmap const *map,
|
struct hashmap const *map,
|
||||||
|
@ -81,18 +64,6 @@ hashmap_foreach (
|
||||||
void *user_data
|
void *user_data
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for an entry in the hashmap that matches the given key.
|
|
||||||
*
|
|
||||||
* If the key matches multiple entries,
|
|
||||||
* it is unspecified which one will return.
|
|
||||||
*
|
|
||||||
* If entry_id_ptr is not NULL, on a successful lookup,
|
|
||||||
* it will be set to a value that can be later be passed to
|
|
||||||
* hashmap_entry_delete().
|
|
||||||
*
|
|
||||||
* Returns an entry if found, or NULL if not.
|
|
||||||
*/
|
|
||||||
void *
|
void *
|
||||||
hashmap_search (
|
hashmap_search (
|
||||||
struct hashmap const *map,
|
struct hashmap const *map,
|
||||||
|
@ -101,11 +72,6 @@ hashmap_search (
|
||||||
unsigned long *entry_id_ptr
|
unsigned long *entry_id_ptr
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert an entry into the hashmap.
|
|
||||||
*
|
|
||||||
* Invalidates all entry IDs given by previous hashmap_search() calls.
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
hashmap_insert (
|
hashmap_insert (
|
||||||
struct hashmap *map,
|
struct hashmap *map,
|
||||||
|
@ -113,14 +79,6 @@ hashmap_insert (
|
||||||
void *entry
|
void *entry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove an entry from the hashmap.
|
|
||||||
* Undefined behavior if the entry does not exist in hashmap.
|
|
||||||
*
|
|
||||||
* The entry_id argument should either be the value given by the
|
|
||||||
* hashmap_search() or hashmap_insert() function call where the
|
|
||||||
* entry is returned from, or -1 (less efficient).
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
hashmap_delete (
|
hashmap_delete (
|
||||||
struct hashmap *map,
|
struct hashmap *map,
|
||||||
|
|
Loading…
Add table
Reference in a new issue