util/djb_hash: make inline and constexpr

Allows calculating hashes at compile time.
This commit is contained in:
Max Kellermann 2024-05-06 23:04:41 +02:00 committed by Max Kellermann
parent c7409d1e04
commit 9e3a66d5bf
3 changed files with 30 additions and 48 deletions

View File

@ -1,40 +0,0 @@
// SPDX-License-Identifier: BSD-2-Clause
// Copyright CM4all GmbH
// author: Max Kellermann <mk@cm4all.com>
#include "djb_hash.hxx"
#include <cassert>
[[gnu::always_inline]] [[gnu::hot]]
static constexpr std::size_t
djb_hash_update(std::size_t hash, std::byte b) noexcept
{
return (hash * 33) ^ static_cast<std::size_t>(b);
}
[[gnu::hot]]
std::size_t
djb_hash(std::span<const std::byte> src, std::size_t init) noexcept
{
std::size_t hash = init;
for (const auto i : src)
hash = djb_hash_update(hash, i);
return hash;
}
[[gnu::hot]]
std::size_t
djb_hash_string(const char *p, std::size_t init) noexcept
{
assert(p != nullptr);
std::size_t hash = init;
while (*p != 0)
hash = djb_hash_update(hash, static_cast<std::byte>(*p++));
return hash;
}

View File

@ -14,12 +14,35 @@
static constexpr std::size_t DJB_HASH_INIT = 5381;
[[gnu::pure]]
std::size_t
djb_hash(std::span<const std::byte> src,
std::size_t init=DJB_HASH_INIT) noexcept;
[[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<std::size_t>(b);
}
[[gnu::pure]]
std::size_t
[[nodiscard]] [[gnu::hot]]
constexpr std::size_t
djb_hash(std::span<const std::byte> 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 init=DJB_HASH_INIT) noexcept
{
std::size_t hash = init;
while (*p != 0)
hash = djb_hash_update(hash, static_cast<std::byte>(*p++));
return hash;
}

View File

@ -23,7 +23,6 @@ util = static_library(
'ByteReverse.cxx',
'format.c',
'BitReverse.cxx',
'djb_hash.cxx',
'Serial.cxx',
include_directories: inc,
)