/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(std::string_view str) noexcept |
36 | 139 | -> 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 |