|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_HASH_H_ | 
|  | #define BASE_HASH_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <limits> | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/string16.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // Computes a hash of a memory buffer. This hash function is subject to change | 
|  | // in the future, so use only for temporary in-memory structures. If you need | 
|  | // to persist a change on disk or between computers, use PersistentHash(). | 
|  | // | 
|  | // WARNING: This hash function should not be used for any cryptographic purpose. | 
|  | BASE_EXPORT uint32_t Hash(const void* data, size_t length); | 
|  | BASE_EXPORT uint32_t Hash(const std::string& str); | 
|  | BASE_EXPORT uint32_t Hash(const string16& str); | 
|  |  | 
|  | // Computes a hash of a memory buffer. This hash function must not change so | 
|  | // that code can use the hashed values for persistent storage purposes or | 
|  | // sending across the network. If a new persistent hash function is desired, a | 
|  | // new version will have to be added in addition. | 
|  | // | 
|  | // WARNING: This hash function should not be used for any cryptographic purpose. | 
|  | BASE_EXPORT uint32_t PersistentHash(const void* data, size_t length); | 
|  | BASE_EXPORT uint32_t PersistentHash(const std::string& str); | 
|  |  | 
|  | // Hash pairs of 32-bit or 64-bit numbers. | 
|  | BASE_EXPORT size_t HashInts32(uint32_t value1, uint32_t value2); | 
|  | BASE_EXPORT size_t HashInts64(uint64_t value1, uint64_t value2); | 
|  |  | 
|  | template <typename T1, typename T2> | 
|  | inline size_t HashInts(T1 value1, T2 value2) { | 
|  | // This condition is expected to be compile-time evaluated and optimised away | 
|  | // in release builds. | 
|  | if (sizeof(T1) > sizeof(uint32_t) || (sizeof(T2) > sizeof(uint32_t))) | 
|  | return HashInts64(value1, value2); | 
|  |  | 
|  | return HashInts32(value1, value2); | 
|  | } | 
|  |  | 
|  | // A templated hasher for pairs of integer types. Example: | 
|  | // | 
|  | //   using MyPair = std::pair<int32_t, int32_t>; | 
|  | //   std::unordered_set<MyPair, base::IntPairHash<MyPair>> set; | 
|  | template <typename T> | 
|  | struct IntPairHash; | 
|  |  | 
|  | template <typename Type1, typename Type2> | 
|  | struct IntPairHash<std::pair<Type1, Type2>> { | 
|  | size_t operator()(std::pair<Type1, Type2> value) const { | 
|  | return HashInts(value.first, value.second); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_HASH_H_ |