Lightweight 8 byte hash function algorithm

后端 未结 4 2212
旧巷少年郎
旧巷少年郎 2021-01-02 13:27

I need to extract an 8 byte digest from a variable length string so I\'m looking for such an algorithm that I will implement in c/c++. That will be part of a digital signatu

4条回答
  •  借酒劲吻你
    2021-01-02 14:20

    I had the exact same requirement, and I settled for FNV-1A, after dismissing SIP hash (implemented by bloomberg here).

    I found an FNV implementation here:

    https://github.com/foonathan/string_id/blob/master/hash.hpp

    which is:

    constexpr uint64_t fnv_basis = 14695981039346656037ull;
    constexpr uint64_t fnv_prime = 1099511628211ull;
    
    // FNV-1a 64 bit hash of null terminated buffer
    uint64_t fnv1a_hash(const char* str, uint64_t hash = fnv_basis)
    {
        return *str ? fnv1a_hash(str + 1, (hash ^ *str) * fnv_prime) : hash;
    }
    

    It appears he is looping using tail recursion. And stop condition is the null byte.
    (boost uses hash_range which is hash_combining each element in chain I guess.)

    License is zlib and copyright is Jonathan Müller. Though I'm not convinced a oneliner can be legally licensed if it implements research by other persons (Fowler-Noll-Vo).

提交回复
热议问题