util/djb_hash: make inline and constexpr
Allows calculating hashes at compile time.
This commit is contained in:
parent
c7409d1e04
commit
9e3a66d5bf
@ -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;
|
|
||||||
}
|
|
@ -14,12 +14,35 @@
|
|||||||
|
|
||||||
static constexpr std::size_t DJB_HASH_INIT = 5381;
|
static constexpr std::size_t DJB_HASH_INIT = 5381;
|
||||||
|
|
||||||
[[gnu::pure]]
|
[[nodiscard]] [[gnu::always_inline]] [[gnu::hot]]
|
||||||
std::size_t
|
constexpr std::size_t
|
||||||
djb_hash(std::span<const std::byte> src,
|
djb_hash_update(std::size_t hash, std::byte b) noexcept
|
||||||
std::size_t init=DJB_HASH_INIT) noexcept;
|
{
|
||||||
|
return (hash * 33) ^ static_cast<std::size_t>(b);
|
||||||
|
}
|
||||||
|
|
||||||
[[gnu::pure]]
|
[[nodiscard]] [[gnu::hot]]
|
||||||
std::size_t
|
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,
|
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;
|
||||||
|
}
|
||||||
|
@ -23,7 +23,6 @@ util = static_library(
|
|||||||
'ByteReverse.cxx',
|
'ByteReverse.cxx',
|
||||||
'format.c',
|
'format.c',
|
||||||
'BitReverse.cxx',
|
'BitReverse.cxx',
|
||||||
'djb_hash.cxx',
|
|
||||||
'Serial.cxx',
|
'Serial.cxx',
|
||||||
include_directories: inc,
|
include_directories: inc,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user