| // 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_ |