libaaruformat 1.0
Aaru Data Preservation Suite - Format Library
Loading...
Searching...
No Matches
hash_map.h File Reference
#include <stdbool.h>
#include <stdlib.h>

Go to the source code of this file.

Data Structures

struct  kv_pair_t
 Single key/value slot used internally by the open-addressing hash map. More...
struct  hash_map_t
 Minimal open-addressing hash map for 64-bit key/value pairs used in deduplication lookup. More...

Functions

hash_map_tcreate_map (size_t size)
 Creates a new hash map with the specified initial size.
void free_map (hash_map_t *map)
 Frees all memory associated with a hash map.
bool insert_map (hash_map_t *map, uint64_t key, uint64_t value)
 Inserts a key-value pair into the hash map.
bool lookup_map (const hash_map_t *map, uint64_t key, uint64_t *out_value)
 Looks up a value by key in the hash map.

Function Documentation

◆ create_map()

hash_map_t * create_map ( size_t size)

Creates a new hash map with the specified initial size.

Allocates and initializes a new hash map structure with the given size. The hash map uses open addressing with linear probing for collision resolution. The table is zero-initialized, making empty slots identifiable by having a key value of 0.

Parameters
sizeInitial size of the hash table. Must be greater than 0.
Returns
Returns a pointer to the newly created hash map, or NULL if allocation fails.
Return values
hash_map_t*Successfully created hash map with:
  • Allocated and zero-initialized table of specified size
  • Size set to the requested value
  • Count initialized to 0 (empty map)
NULLMemory allocation failed
Note
The caller is responsible for freeing the returned hash map using free_map().
A key value of 0 is reserved to indicate empty slots and cannot be used as a valid key.
See also
free_map()

Definition at line 49 of file hash_map.c.

References hash_map_t::count, hash_map_t::size, and hash_map_t::table.

Referenced by aaruf_create(), and aaruf_open().

◆ free_map()

void free_map ( hash_map_t * map)

Frees all memory associated with a hash map.

Deallocates the hash table and the hash map structure itself. After calling this function, the hash map pointer becomes invalid and should not be used.

Parameters
mapPointer to the hash map to free. Can be NULL (no operation performed).
Note
This function does not free any memory pointed to by the values stored in the map. If the values are dynamically allocated, they must be freed separately before calling this function.
See also
create_map()

Definition at line 73 of file hash_map.c.

References hash_map_t::table.

Referenced by aaruf_close(), and cleanup_failed_create().

◆ insert_map()

bool insert_map ( hash_map_t * map,
uint64_t key,
uint64_t value )

Inserts a key-value pair into the hash map.

Adds a new key-value pair to the hash map using open addressing with linear probing for collision resolution. If the key already exists, the insertion fails and returns false. The function automatically resizes the hash table when the load factor exceeds the threshold (0.75) to maintain optimal performance.

Parameters
mapPointer to the hash map. Must not be NULL.
keyThe key to insert. Must not be 0 as this value is reserved for empty slots.
valueThe value to associate with the key.
Returns
Returns the result of the insertion operation.
Return values
trueSuccessfully inserted the key-value pair. The map count is incremented.
falseKey already exists in the map. No changes made to the map.
Note
If insertion would exceed the load factor threshold, the hash table is automatically resized to twice its current size before insertion.
Time complexity: O(1) average case, O(n) worst case with poor hash distribution.
Space complexity: O(1) unless resizing occurs, in which case it's O(n).
Warning
Using 0 as a key value will result in undefined behavior as 0 is reserved for marking empty slots.
If memory allocation fails during automatic resizing, the program may terminate.
See also
lookup_map()
resize_map()

Definition at line 153 of file hash_map.c.

References hash_map_t::count, kv_pair_t::key, LOAD_FACTOR, resize_map(), hash_map_t::size, hash_map_t::table, and kv_pair_t::value.

Referenced by aaruf_write_sector().

◆ lookup_map()

bool lookup_map ( const hash_map_t * map,
uint64_t key,
uint64_t * out_value )

Looks up a value by key in the hash map.

Searches for the specified key in the hash map and retrieves its associated value. Uses linear probing to handle collisions during the search. The function does not modify the hash map in any way.

Parameters
mapPointer to the hash map to search. Must not be NULL.
keyThe key to search for. Must not be 0.
out_valuePointer to store the found value. Must not be NULL. Only modified if the key is found.
Returns
Returns whether the key was found in the map.
Return values
trueKey found. The associated value is written to *out_value.
falseKey not found. *out_value is not modified.
Note
Time complexity: O(1) average case, O(n) worst case with poor hash distribution or high load factor.
The function is read-only and does not modify the hash map structure.
Searching for key value 0 will always return false as 0 indicates empty slots.
Warning
The out_value parameter must point to valid memory location. Passing NULL will result in undefined behavior.
See also
insert_map()

Definition at line 196 of file hash_map.c.

References kv_pair_t::key, hash_map_t::size, hash_map_t::table, and kv_pair_t::value.

Referenced by aaruf_write_sector().