1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_HASH_HASH_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_HASH_HASH_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <limits>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <string_view>
14*6777b538SAndroid Build Coastguard Worker #include <utility>
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker namespace base {
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker // WARNING: These hash functions should not be used for any cryptographic
22*6777b538SAndroid Build Coastguard Worker // purpose.
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker // Deprecated: Computes a hash of a memory buffer, use FastHash() instead.
25*6777b538SAndroid Build Coastguard Worker // If you need to persist a change on disk or between computers, use
26*6777b538SAndroid Build Coastguard Worker // PersistentHash().
27*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1025358): Migrate client code to new hash function.
28*6777b538SAndroid Build Coastguard Worker BASE_EXPORT uint32_t Hash(const std::string& str);
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker // Really *fast* and high quality hash.
31*6777b538SAndroid Build Coastguard Worker // Recommended hash function for general use, we pick the best performant
32*6777b538SAndroid Build Coastguard Worker // hash for each build target.
33*6777b538SAndroid Build Coastguard Worker // It is prone to be updated whenever a newer/faster hash function is
34*6777b538SAndroid Build Coastguard Worker // publicly available.
35*6777b538SAndroid Build Coastguard Worker // May changed without warning, do not expect stability of outputs.
36*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t FastHash(base::span<const uint8_t> data);
FastHash(std::string_view str)37*6777b538SAndroid Build Coastguard Worker inline size_t FastHash(std::string_view str) {
38*6777b538SAndroid Build Coastguard Worker return FastHash(as_bytes(make_span(str)));
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // Computes a hash of a memory buffer. This hash function must not change so
42*6777b538SAndroid Build Coastguard Worker // that code can use the hashed values for persistent storage purposes or
43*6777b538SAndroid Build Coastguard Worker // sending across the network. If a new persistent hash function is desired, a
44*6777b538SAndroid Build Coastguard Worker // new version will have to be added in addition.
45*6777b538SAndroid Build Coastguard Worker //
46*6777b538SAndroid Build Coastguard Worker // WARNING: This hash function should not be used for any cryptographic purpose.
47*6777b538SAndroid Build Coastguard Worker BASE_EXPORT uint32_t PersistentHash(base::span<const uint8_t> data);
48*6777b538SAndroid Build Coastguard Worker BASE_EXPORT uint32_t PersistentHash(std::string_view str);
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker // Hash pairs of 32-bit or 64-bit numbers.
51*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t HashInts32(uint32_t value1, uint32_t value2);
52*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t HashInts64(uint64_t value1, uint64_t value2);
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker template <typename T1, typename T2>
HashInts(T1 value1,T2 value2)55*6777b538SAndroid Build Coastguard Worker inline size_t HashInts(T1 value1, T2 value2) {
56*6777b538SAndroid Build Coastguard Worker // This condition is expected to be compile-time evaluated and optimised away
57*6777b538SAndroid Build Coastguard Worker // in release builds.
58*6777b538SAndroid Build Coastguard Worker if (sizeof(T1) > sizeof(uint32_t) || (sizeof(T2) > sizeof(uint32_t)))
59*6777b538SAndroid Build Coastguard Worker return HashInts64(value1, value2);
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker return HashInts32(static_cast<uint32_t>(value1),
62*6777b538SAndroid Build Coastguard Worker static_cast<uint32_t>(value2));
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker // A templated hasher for pairs of integer types. Example:
66*6777b538SAndroid Build Coastguard Worker //
67*6777b538SAndroid Build Coastguard Worker // using MyPair = std::pair<int32_t, int32_t>;
68*6777b538SAndroid Build Coastguard Worker // std::unordered_set<MyPair, base::IntPairHash<MyPair>> set;
69*6777b538SAndroid Build Coastguard Worker template <typename T>
70*6777b538SAndroid Build Coastguard Worker struct IntPairHash;
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker template <typename Type1, typename Type2>
73*6777b538SAndroid Build Coastguard Worker struct IntPairHash<std::pair<Type1, Type2>> {
74*6777b538SAndroid Build Coastguard Worker size_t operator()(std::pair<Type1, Type2> value) const {
75*6777b538SAndroid Build Coastguard Worker return HashInts(value.first, value.second);
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker };
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker } // namespace base
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker #endif // BASE_HASH_HASH_H_
82