Convert Figma logo to code with AI

troydhanson logouthash

C macros for hash tables and more

4,076
918
4,076
32

Top Related Projects

26,312

stb single-file public domain libraries for C/C++

3,648

Jsmn is a world fastest JSON parser/tokenizer. This is the official repo replacing the old one at Bitbucket

10,604

Ultralightweight JSON parser in ANSI C

4,117

A standalone and lightweight C library

Quick Overview

uthash is a hash table implementation for C structures, designed to be easy to use and efficient. It provides macros for adding, finding, and deleting items from a hash table, allowing developers to create hash tables using any C structure as the key.

Pros

  • Simple to use with a macro-based API
  • Header-only library, easy to integrate into projects
  • Supports various hash table operations (add, find, delete, count, etc.)
  • Works with any C structure as the key

Cons

  • Macro-based implementation may lead to less readable code
  • Limited customization options for hash functions
  • Not thread-safe by default
  • May have a steeper learning curve for developers unfamiliar with macro-heavy C programming

Code Examples

Adding an item to a hash table:

#include "uthash.h"

struct my_struct {
    int id;            /* key */
    char name[10];
    UT_hash_handle hh; /* makes this structure hashable */
};

struct my_struct *users = NULL;

void add_user(int user_id, char *name) {
    struct my_struct *s;
    s = malloc(sizeof(struct my_struct));
    s->id = user_id;
    strcpy(s->name, name);
    HASH_ADD_INT(users, id, s);
}

Finding an item in the hash table:

struct my_struct *find_user(int user_id) {
    struct my_struct *s;
    HASH_FIND_INT(users, &user_id, s);
    return s;
}

Deleting an item from the hash table:

void delete_user(struct my_struct *user) {
    HASH_DEL(users, user);
    free(user);
}

Getting Started

To use uthash in your project:

  1. Download the uthash.h header file from the GitHub repository.
  2. Include the header in your C source file:
    #include "uthash.h"
    
  3. Define a structure with a UT_hash_handle member:
    struct my_struct {
        int key;
        /* other members */
        UT_hash_handle hh;
    };
    
  4. Use the provided macros (e.g., HASH_ADD, HASH_FIND, HASH_DEL) to manipulate the hash table.

Competitor Comparisons

26,312

stb single-file public domain libraries for C/C++

Pros of stb

  • Broader scope with multiple libraries for various tasks (image loading, audio processing, etc.)
  • Single-file, header-only libraries for easy integration
  • More actively maintained with frequent updates

Cons of stb

  • Larger codebase due to multiple libraries, potentially increasing complexity
  • May include unnecessary functionality for projects requiring only specific features
  • Less focused on hash table implementations compared to uthash

Code Comparison

uthash example:

#include "uthash.h"
struct my_struct {
    int id;
    char name[10];
    UT_hash_handle hh;
};

stb example (using stb_ds.h):

#include "stb_ds.h"
typedef struct { int key; float value; } pair;
pair *map = NULL;
shput(map, 1, 1.5f);

Summary

stb offers a wider range of functionality in a single-file, header-only format, making it suitable for various projects. However, uthash provides a more focused solution for hash table implementations. stb's broader scope may introduce unnecessary complexity for projects requiring only specific features, while uthash remains lightweight and specialized. The choice between the two depends on the project's requirements and the developer's preference for either a comprehensive toolkit or a targeted solution.

3,648

Jsmn is a world fastest JSON parser/tokenizer. This is the official repo replacing the old one at Bitbucket

Pros of jsmn

  • Lightweight and minimalistic JSON parser
  • No dynamic memory allocation, suitable for embedded systems
  • Single-file implementation, easy to integrate

Cons of jsmn

  • Limited functionality compared to uthash
  • Requires manual parsing of JSON tokens
  • Not a general-purpose data structure library

Code Comparison

jsmn (JSON parsing):

jsmn_parser p;
jsmntok_t t[128];
jsmn_init(&p);
int r = jsmn_parse(&p, json_string, strlen(json_string), t, sizeof(t)/sizeof(t[0]));

uthash (Hash table operations):

struct my_struct *s;
HASH_FIND_STR(users, "username", s);
HASH_ADD_STR(users, name, s);
HASH_DEL(users, s);

Summary

jsmn is a lightweight JSON parser focused on minimal memory usage and simplicity. It's ideal for embedded systems or projects with limited resources. uthash, on the other hand, is a more comprehensive library providing hash table functionality for C structures. While jsmn excels in JSON parsing, uthash offers broader data structure manipulation capabilities. The choice between them depends on the specific requirements of your project, whether you need JSON parsing or general-purpose hash table operations.

10,604

Ultralightweight JSON parser in ANSI C

Pros of cJSON

  • Specialized for JSON parsing and generation
  • Lightweight and easy to integrate into existing projects
  • Supports both JSON encoding and decoding

Cons of cJSON

  • Limited to JSON data structures
  • May require additional memory management
  • Less flexible for general-purpose hash table needs

Code Comparison

cJSON:

cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "name", "John");
cJSON_AddNumberToObject(root, "age", 30);
char *json_string = cJSON_Print(root);
cJSON_Delete(root);

uthash:

struct my_struct *s;
HASH_FIND_STR(users, "john", s);
if (s == NULL) {
    s = malloc(sizeof(struct my_struct));
    strcpy(s->name, "john");
    HASH_ADD_STR(users, name, s);
}

Key Differences

  • cJSON is focused on JSON manipulation, while uthash is a general-purpose hash table library
  • uthash provides more flexibility for custom data structures and key types
  • cJSON offers built-in JSON parsing and generation, which uthash doesn't provide
  • uthash is header-only, making it easier to include in projects without additional compilation steps
  • cJSON may be more suitable for projects primarily dealing with JSON data, while uthash is better for general hash table needs
4,117

A standalone and lightweight C library

Pros of klib

  • Broader range of data structures and algorithms (e.g., hash tables, binary trees, sorting)
  • Generally faster performance for most operations
  • More compact code, potentially easier to integrate into existing projects

Cons of klib

  • Less documentation and examples compared to uthash
  • Requires more manual memory management in some cases
  • May be more challenging for beginners due to its concise nature

Code Comparison

uthash example:

#include "uthash.h"
struct my_struct {
    int id;
    char name[10];
    UT_hash_handle hh;
};

klib example:

#include "khash.h"
KHASH_MAP_INIT_INT(m32, char*)
khash_t(m32) *h = kh_init(m32);
int ret, is_missing;
khiter_t k = kh_put(m32, h, 5, &ret);

Both libraries provide efficient hash table implementations, but klib offers a wider range of data structures and algorithms. uthash is more focused on hash tables and may be easier for beginners to use due to its extensive documentation. klib generally provides better performance but requires more manual memory management in some cases.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Build status GitHub CI status

Documentation for uthash is available at:

https://troydhanson.github.io/uthash/