// SPDX-License-Identifier: BSD-2-Clause // Copyright CM4all GmbH // author: Max Kellermann /* * Implementation of D. J. Bernstein's cdb hash function. * http://cr.yp.to/cdb/cdb.txt */ #pragma once #include #include static constexpr std::size_t DJB_HASH_INIT = 5381; [[nodiscard]] [[gnu::always_inline]] [[gnu::hot]] constexpr std::size_t djb_hash_update(std::size_t hash, std::byte b) noexcept { return (hash * 33) ^ static_cast(b); } [[nodiscard]] [[gnu::hot]] constexpr std::size_t djb_hash(std::span src, std::size_t init=DJB_HASH_INIT) noexcept { std::size_t hash = init; for (const auto i : src) hash = djb_hash_update(hash, i); return hash; } [[nodiscard]] [[gnu::hot]] constexpr std::size_t djb_hash_string(const char *p, std::size_t init=DJB_HASH_INIT) noexcept { std::size_t hash = init; while (*p != 0) hash = djb_hash_update(hash, static_cast(*p++)); return hash; }