Move core/lib/hash/hash library into core/platform
PiperOrigin-RevId: 283163718 Change-Id: Id26152d57361c0f1c513949c4819eb05c4d126d4
This commit is contained in:
parent
ed17bc6283
commit
699e26023a
@ -2270,6 +2270,7 @@ cc_library(
|
||||
"//tensorflow/core/platform:errors",
|
||||
"//tensorflow/core/platform:file_statistics",
|
||||
"//tensorflow/core/platform:fingerprint",
|
||||
"//tensorflow/core/platform:hash",
|
||||
"//tensorflow/core/platform:load_library",
|
||||
"//tensorflow/core/platform:logger",
|
||||
"//tensorflow/core/platform:mutex",
|
||||
|
@ -41,13 +41,9 @@ cc_library(
|
||||
|
||||
cc_library(
|
||||
name = "hash",
|
||||
srcs = ["hash.cc"],
|
||||
hdrs = ["hash.h"],
|
||||
deps = [
|
||||
"//tensorflow/core/lib/core:raw_coding",
|
||||
"//tensorflow/core/lib/core:stringpiece",
|
||||
"//tensorflow/core/platform:macros",
|
||||
"//tensorflow/core/platform:types",
|
||||
"//tensorflow/core/platform:hash",
|
||||
],
|
||||
)
|
||||
|
||||
@ -65,7 +61,6 @@ filegroup(
|
||||
srcs = [
|
||||
"crc32c.cc",
|
||||
"crc32c_accelerate.cc",
|
||||
"hash.cc",
|
||||
],
|
||||
visibility = ["//tensorflow/core:__pkg__"],
|
||||
)
|
||||
|
@ -18,96 +18,6 @@ limitations under the License.
|
||||
#ifndef TENSORFLOW_CORE_LIB_HASH_HASH_H_
|
||||
#define TENSORFLOW_CORE_LIB_HASH_HASH_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#include "tensorflow/core/lib/core/stringpiece.h"
|
||||
#include "tensorflow/core/platform/types.h"
|
||||
|
||||
namespace tensorflow {
|
||||
|
||||
extern uint32 Hash32(const char* data, size_t n, uint32 seed);
|
||||
extern uint64 Hash64(const char* data, size_t n, uint64 seed);
|
||||
|
||||
inline uint64 Hash64(const char* data, size_t n) {
|
||||
return Hash64(data, n, 0xDECAFCAFFE);
|
||||
}
|
||||
|
||||
inline uint64 Hash64(const string& str) {
|
||||
return Hash64(str.data(), str.size());
|
||||
}
|
||||
|
||||
inline uint64 Hash64Combine(uint64 a, uint64 b) {
|
||||
return a ^ (b + 0x9e3779b97f4a7800ULL + (a << 10) + (a >> 4));
|
||||
}
|
||||
|
||||
// Combine two hashes in an order-independent way. This operation should be
|
||||
// associative and compute the same hash for a collection of elements
|
||||
// independent of traversal order. Note that it is better to combine hashes
|
||||
// symmetrically with addition rather than XOR, since (x^x) == 0 but (x+x) != 0.
|
||||
inline uint64 Hash64CombineUnordered(uint64 a, uint64 b) { return a + b; }
|
||||
|
||||
// Hash functor suitable for use with power-of-two sized hashtables. Use
|
||||
// instead of std::hash<T>.
|
||||
//
|
||||
// In particular, tensorflow::hash is not the identity function for pointers.
|
||||
// This is important for power-of-two sized hashtables like FlatMap and FlatSet,
|
||||
// because otherwise they waste the majority of their hash buckets.
|
||||
//
|
||||
// The second type argument is only used for SFNIAE below.
|
||||
template <typename T, typename = void>
|
||||
struct hash {
|
||||
size_t operator()(const T& t) const { return std::hash<T>()(t); }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct hash<T, typename std::enable_if<std::is_enum<T>::value>::type> {
|
||||
size_t operator()(T value) const {
|
||||
// This works around a defect in the std::hash C++ spec that isn't fixed in
|
||||
// (at least) gcc 4.8.4:
|
||||
// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148
|
||||
//
|
||||
// We should be able to remove this and use the default
|
||||
// tensorflow::hash<EnumTy>() once we stop building with GCC versions old
|
||||
// enough to not have this defect fixed.
|
||||
return std::hash<uint64>()(static_cast<uint64>(value));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct hash<T*> {
|
||||
size_t operator()(const T* t) const {
|
||||
// Hash pointers as integers, but bring more entropy to the lower bits.
|
||||
size_t k = static_cast<size_t>(reinterpret_cast<uintptr_t>(t));
|
||||
return k + (k >> 6);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct hash<string> {
|
||||
size_t operator()(const string& s) const {
|
||||
return static_cast<size_t>(Hash64(s));
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct hash<StringPiece> {
|
||||
size_t operator()(StringPiece sp) const {
|
||||
return static_cast<size_t>(Hash64(sp.data(), sp.size()));
|
||||
}
|
||||
};
|
||||
using StringPieceHasher = ::tensorflow::hash<StringPiece>;
|
||||
|
||||
template <typename T, typename U>
|
||||
struct hash<std::pair<T, U>> {
|
||||
size_t operator()(const std::pair<T, U>& p) const {
|
||||
return Hash64Combine(hash<T>()(p.first), hash<U>()(p.second));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tensorflow
|
||||
#include "tensorflow/core/platform/hash.h"
|
||||
|
||||
#endif // TENSORFLOW_CORE_LIB_HASH_HASH_H_
|
||||
|
@ -215,6 +215,18 @@ cc_library(
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "hash",
|
||||
srcs = ["hash.cc"],
|
||||
hdrs = ["hash.h"],
|
||||
deps = [
|
||||
":macros",
|
||||
":raw_coding",
|
||||
":stringpiece",
|
||||
":types",
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "human_readable_json",
|
||||
textual_hdrs = ["human_readable_json.h"],
|
||||
@ -735,6 +747,7 @@ filegroup(
|
||||
"**/windows_file_system.cc",
|
||||
"abi.cc",
|
||||
"cpu_info.cc",
|
||||
"hash.cc",
|
||||
"numbers.cc",
|
||||
"path.cc",
|
||||
"platform_strings.cc",
|
||||
@ -846,6 +859,7 @@ filegroup(
|
||||
"error.cc",
|
||||
"file_system.cc",
|
||||
"file_system_helper.cc",
|
||||
"hash.cc",
|
||||
"logger.cc",
|
||||
"numbers.cc",
|
||||
"path.cc",
|
||||
|
@ -13,10 +13,10 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/core/lib/hash/hash.h"
|
||||
#include "tensorflow/core/platform/hash.h"
|
||||
|
||||
#include "tensorflow/core/lib/core/raw_coding.h"
|
||||
#include "tensorflow/core/platform/macros.h"
|
||||
#include "tensorflow/core/platform/raw_coding.h"
|
||||
#include "tensorflow/core/platform/types.h"
|
||||
|
||||
#include <string.h>
|
113
tensorflow/core/platform/hash.h
Normal file
113
tensorflow/core/platform/hash.h
Normal file
@ -0,0 +1,113 @@
|
||||
/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
// Simple hash functions used for internal data structures
|
||||
|
||||
#ifndef TENSORFLOW_CORE_PLATFORM_HASH_H_
|
||||
#define TENSORFLOW_CORE_PLATFORM_HASH_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#include "tensorflow/core/platform/stringpiece.h"
|
||||
#include "tensorflow/core/platform/types.h"
|
||||
|
||||
namespace tensorflow {
|
||||
|
||||
extern uint32 Hash32(const char* data, size_t n, uint32 seed);
|
||||
extern uint64 Hash64(const char* data, size_t n, uint64 seed);
|
||||
|
||||
inline uint64 Hash64(const char* data, size_t n) {
|
||||
return Hash64(data, n, 0xDECAFCAFFE);
|
||||
}
|
||||
|
||||
inline uint64 Hash64(const string& str) {
|
||||
return Hash64(str.data(), str.size());
|
||||
}
|
||||
|
||||
inline uint64 Hash64Combine(uint64 a, uint64 b) {
|
||||
return a ^ (b + 0x9e3779b97f4a7800ULL + (a << 10) + (a >> 4));
|
||||
}
|
||||
|
||||
// Combine two hashes in an order-independent way. This operation should be
|
||||
// associative and compute the same hash for a collection of elements
|
||||
// independent of traversal order. Note that it is better to combine hashes
|
||||
// symmetrically with addition rather than XOR, since (x^x) == 0 but (x+x) != 0.
|
||||
inline uint64 Hash64CombineUnordered(uint64 a, uint64 b) { return a + b; }
|
||||
|
||||
// Hash functor suitable for use with power-of-two sized hashtables. Use
|
||||
// instead of std::hash<T>.
|
||||
//
|
||||
// In particular, tensorflow::hash is not the identity function for pointers.
|
||||
// This is important for power-of-two sized hashtables like FlatMap and FlatSet,
|
||||
// because otherwise they waste the majority of their hash buckets.
|
||||
//
|
||||
// The second type argument is only used for SFNIAE below.
|
||||
template <typename T, typename = void>
|
||||
struct hash {
|
||||
size_t operator()(const T& t) const { return std::hash<T>()(t); }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct hash<T, typename std::enable_if<std::is_enum<T>::value>::type> {
|
||||
size_t operator()(T value) const {
|
||||
// This works around a defect in the std::hash C++ spec that isn't fixed in
|
||||
// (at least) gcc 4.8.4:
|
||||
// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148
|
||||
//
|
||||
// We should be able to remove this and use the default
|
||||
// tensorflow::hash<EnumTy>() once we stop building with GCC versions old
|
||||
// enough to not have this defect fixed.
|
||||
return std::hash<uint64>()(static_cast<uint64>(value));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct hash<T*> {
|
||||
size_t operator()(const T* t) const {
|
||||
// Hash pointers as integers, but bring more entropy to the lower bits.
|
||||
size_t k = static_cast<size_t>(reinterpret_cast<uintptr_t>(t));
|
||||
return k + (k >> 6);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct hash<string> {
|
||||
size_t operator()(const string& s) const {
|
||||
return static_cast<size_t>(Hash64(s));
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct hash<StringPiece> {
|
||||
size_t operator()(StringPiece sp) const {
|
||||
return static_cast<size_t>(Hash64(sp.data(), sp.size()));
|
||||
}
|
||||
};
|
||||
using StringPieceHasher = ::tensorflow::hash<StringPiece>;
|
||||
|
||||
template <typename T, typename U>
|
||||
struct hash<std::pair<T, U>> {
|
||||
size_t operator()(const std::pair<T, U>& p) const {
|
||||
return Hash64Combine(hash<T>()(p.first), hash<U>()(p.second));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tensorflow
|
||||
|
||||
#endif // TENSORFLOW_CORE_PLATFORM_HASH_H_
|
Loading…
x
Reference in New Issue
Block a user