xxHash README

The project's README from github.com/Cyan4973/xxHash. As one markdown file: README.md.

xxHash - Extremely fast hash algorithm

xxHash is an Extremely fast Hash algorithm, processing at RAM speed limits. Code is highly portable, and produces hashes identical across all platforms (little / big endian). The library includes the following algorithms :

All variants successfully complete the SMHasher test suite which evaluates the quality of hash functions (collision, dispersion and randomness). Additional tests, which evaluate more thoroughly speed and collision properties of 64-bit hashes, are also provided.

Branch Status
release Build Status
dev Build Status

Benchmarks

The benchmarked reference system uses an Intel i7-9700K cpu, and runs Ubuntu x64 20.04. The open source benchmark program is compiled with clang v10.0 using -O3 flag.

Hash Name Width Bandwidth (GB/s) Small Data Velocity Quality Comment
XXH3 (SSE2) 64 31.5 GB/s 133.1 10
XXH128 (SSE2) 128 29.6 GB/s 118.1 10
RAM sequential read N/A 28.0 GB/s N/A N/A for reference
City64 64 22.0 GB/s 76.6 10
T1ha2 64 22.0 GB/s 99.0 9 Slightly worse collisions
City128 128 21.7 GB/s 57.7 10
XXH64 64 19.4 GB/s 71.0 10
SpookyHash 64 19.3 GB/s 53.2 10
Mum 64 18.0 GB/s 67.0 9 Slightly worse collisions
XXH32 32 9.7 GB/s 71.9 10
City32 32 9.1 GB/s 66.0 10
Murmur3 32 3.9 GB/s 56.1 10
SipHash 64 3.0 GB/s 43.2 10
FNV64 64 1.2 GB/s 62.7 5 Poor avalanche properties
Blake2 256 1.1 GB/s 5.1 10 Cryptographic
SHA1 160 0.8 GB/s 5.6 10 Cryptographic but broken
MD5 128 0.6 GB/s 7.8 10 Cryptographic but broken

note 1: Small data velocity is a rough evaluation of algorithm's efficiency on small data. For more detailed analysis, please refer to next paragraph.

note 2: some algorithms feature faster than RAM speed. In which case, they can only reach their full speed potential when input is already in CPU cache (L3 or better). Otherwise, they max out on RAM speed limit.

Small data

Performance on large data is only one part of the picture. Hashing is also very useful in constructions like hash tables and bloom filters. In these use cases, it's frequent to hash a lot of small data (starting at a few bytes). Algorithm's performance can be very different for such scenarios, since parts of the algorithm, such as initialization or finalization, become fixed cost. The impact of branch mis-prediction also becomes much more present.

XXH3 has been designed for excellent performance on both long and small inputs, which can be observed in the following graph:

XXH3, latency, random size

For a more detailed analysis, please visit the wiki : https://github.com/Cyan4973/xxHash/wiki/Performance-comparison#benchmarks-concentrating-on-small-data-

Quality

Speed is not the only property that matters. Produced hash values must respect excellent dispersion and randomness properties, so that any sub-section of it can be used to maximally spread out a table or index, as well as reduce the amount of collisions to the minimal theoretical level, following the birthday paradox.

xxHash has been tested with Austin Appleby's excellent SMHasher test suite, and passes all tests, ensuring reasonable quality levels. It also passes extended tests from newer forks of SMHasher, featuring additional scenarios and conditions.

Finally, xxHash provides its own massive collision tester, able to generate and compare billions of hashes to test the limits of 64-bit hash algorithms. On this front too, xxHash features good results, in line with the birthday paradox. A more detailed analysis is documented in the wiki.

Build modifiers

The following macros can be set at compilation time to modify libxxhash's behavior. They are generally disabled by default.

Binary size control

Build modifiers specific for XXH3

Build modifiers for xxhsum CLI

Makefile variables

When compiling the Command Line Interface xxhsum using make, the following environment variables can also be set :

Building xxHash - Using vcpkg

You can download and install xxHash using the vcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install xxhash

The xxHash port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Example

The simplest example calls xxhash 64-bit variant as a one-shot function generating a hash value from a single buffer, and invoked from a C/C++ program:

#include "xxhash.h"

    (...)
    XXH64_hash_t hash = XXH64(buffer, size, seed);
}

Streaming variant is more involved, but makes it possible to provide data incrementally:

#include "stdlib.h"   /* abort() */
#include "xxhash.h"


XXH64_hash_t calcul_hash_streaming(FileHandler fh)
{
    /* create a hash state */
    XXH64_state_t* const state = XXH64_createState();
    if (state==NULL) abort();

    size_t const bufferSize = SOME_SIZE;
    void* const buffer = malloc(bufferSize);
    if (buffer==NULL) abort();

    /* Initialize state with selected seed */
    XXH64_hash_t const seed = 0;   /* or any other value */
    if (XXH64_reset(state, seed) == XXH_ERROR) abort();

    /* Feed the state with input data, any size, any number of times */
    (...)
    while ( /* some data left */ ) {
        size_t const length = get_more_data(buffer, bufferSize, fh);
        if (XXH64_update(state, buffer, length) == XXH_ERROR) abort();
        (...)
    }
    (...)

    /* Produce the final hash value */
    XXH64_hash_t const hash = XXH64_digest(state);

    /* State could be re-used; but in this example, it is simply freed  */
    free(buffer);
    XXH64_freeState(state);

    return hash;
}

License

The library files xxhash.c and xxhash.h are BSD licensed. The utility xxhsum is GPL licensed.

Other programming languages

Beyond the C reference version, xxHash is also available from many different programming languages, thanks to great contributors. They are listed here.

Packaging status

Many distributions bundle a package manager which allows easy xxhash installation as both a libxxhash library and xxhsum command line interface.

Packaging status

Special Thanks

xxHash (Cyan4973/xxHash)

Searching Database…

11.4K ·GitHub
What is this?xxHash is an extremely fast, non-cryptographic hash algorithm library written in C, offering 32-bit (XXH32), 64-bit (XXH64), and the newer vectorized XXH3 (64/128-bit) hash variants.
Is this a library or does it also give me a command-line tool?It is primarily a C library you link or inline into your project, but it also ships 'xxhsum', a command-line tool for hashing files from the terminal, which has its own set of build options.
How do I add xxHash to my project?Install it via the vcpkg dependency manager, or simply drop xxhash.h and xxhash.c directly into your codebase; running 'make' also builds the xxhsum CLI.
Do I need anything besides a C compiler?No, xxHash has no external dependencies; it even lets you redirect or disable standard library calls like malloc/free for embedded targets without dynamic allocation.
Any gotchas when tuning performance?It's non-cryptographic, so it's not meant for security use cases. Also counterintuitively, letting the compiler auto-vectorize XXH32/XXH64 usually hurts rather than helps speed, so the library actively blocks it by default.
Will I get the same hash on different machines?Yes, the algorithm is designed to be fully portable and produces identical hash values regardless of CPU architecture or endianness.
What's the difference between XXH32, XXH64 and XXH3?XXH32 and XXH64 use plain 32-/64-bit arithmetic for 32- and 64-bit hashes, while the newer XXH3 uses vectorized arithmetic to produce faster 64-bit or 128-bit (XXH128) hashes, with especially strong performance on small inputs.
How has hash quality been verified?xxHash passes the full SMHasher test suite checking collision, dispersion and randomness, plus extended tests from newer SMHasher forks and its own purpose-built billion-hash collision tester.
Can I shrink the compiled binary size?Yes, macros like XXH_NO_XXH3 and XXH_NO_LONG_LONG strip out XXH3/XXH64 code paths, and XXH_SIZE_OPT lets you trade raw speed for a smaller footprint.
Why pick xxHash over something like MD5 or SHA1?Its own benchmarks show XXH3 hitting roughly 31.5 GB/s versus SHA1's 0.8 GB/s and MD5's 0.6 GB/s, making it far faster for non-security tasks like hash tables, checksums and bloom filters.
What are similar projects?john, C, lua, lz4, sort-research-rs, CalcKernel, hypoarena, graph
Creator
Cyan4973
Size
5.6 MB
Stars
11.4K
Age
12y
Commits · 90 Days