Coverage Report

Created: 2024-10-11 06:23

/builds/MusicScience37Projects/numerical-analysis/numerical-collection-cpp/include/num_collect/util/hash_string.h
Line
Count
Source
1
/*
2
 * Copyright 2022 MusicScience37 (Kenta Kabashima)
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
/*!
17
 * \file
18
 * \brief Definition of hash_string function.
19
 */
20
#pragma once
21
22
#include <cstdint>
23
#include <string_view>
24
25
namespace num_collect::util {
26
27
/*!
28
 * \brief Calculate a hash number of a string.
29
 *
30
 * \note This function can calculate a hash number at compile-time.
31
 *
32
 * \param[in] str String.
33
 * \return Hash number.
34
 */
35
[[nodiscard]] constexpr auto hash_string(
36
139
    std::string_view str) noexcept -> std::uint32_t {
37
139
    constexpr std::uint32_t init_num = 0x5928ACD1U;
38
139
    std::uint32_t num = init_num;
39
1.43k
    for (char c : str) {
40
1.43k
        const auto added =
41
1.43k
            static_cast<std::uint32_t>(static_cast<unsigned char>(c));
42
1.43k
        constexpr std::uint32_t shift = 5U;
43
1.43k
        num += (num << shift) + added;
44
1.43k
    }
45
139
    return num;
46
139
}
47
48
}  // namespace num_collect::util