tag/Pool: move code from calc_hash() to util/djb_hash.cxx
This commit is contained in:
parent
f578b06d83
commit
c391adad10
|
@ -4,7 +4,9 @@
|
|||
#include "Pool.hxx"
|
||||
#include "Item.hxx"
|
||||
#include "util/Cast.hxx"
|
||||
#include "util/djb_hash.hxx"
|
||||
#include "util/IntrusiveList.hxx"
|
||||
#include "util/SpanCast.hxx"
|
||||
#include "util/VarSize.hxx"
|
||||
|
||||
#include <array>
|
||||
|
@ -12,9 +14,6 @@
|
|||
#include <cstdint>
|
||||
#include <limits>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
Mutex tag_pool_lock;
|
||||
|
||||
struct TagPoolItem {
|
||||
|
@ -53,12 +52,7 @@ static std::array<IntrusiveList<TagPoolItem,
|
|||
static inline std::size_t
|
||||
calc_hash(TagType type, std::string_view p) noexcept
|
||||
{
|
||||
std::size_t hash = 5381;
|
||||
|
||||
for (auto ch : p)
|
||||
hash = (hash << 5) + hash + ch;
|
||||
|
||||
return hash ^ type;
|
||||
return djb_hash(AsBytes(p)) ^ type;
|
||||
}
|
||||
|
||||
static constexpr TagPoolItem *
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
// 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;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
// Copyright CM4all GmbH
|
||||
// author: Max Kellermann <mk@cm4all.com>
|
||||
|
||||
/*
|
||||
* Implementation of D. J. Bernstein's cdb hash function.
|
||||
* http://cr.yp.to/cdb/cdb.txt
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <span>
|
||||
|
||||
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;
|
||||
|
||||
[[gnu::pure]]
|
||||
std::size_t
|
||||
djb_hash_string(const char *p,
|
||||
std::size_t init=DJB_HASH_INIT) noexcept;
|
|
@ -24,6 +24,7 @@ util = static_library(
|
|||
'ByteReverse.cxx',
|
||||
'format.c',
|
||||
'BitReverse.cxx',
|
||||
'djb_hash.cxx',
|
||||
'Serial.cxx',
|
||||
include_directories: inc,
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue