1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_STRINGS_STRING_HASHER_H_ 6 #define V8_STRINGS_STRING_HASHER_H_ 7 8 #include "src/common/globals.h" 9 10 namespace v8 { 11 12 namespace base { 13 template <typename T> 14 class Vector; 15 } // namespace base 16 17 namespace internal { 18 19 // Helper class for incrementally calculating string hashes in a form suitable 20 // for storing into Name::raw_hash_field. 21 class V8_EXPORT_PRIVATE StringHasher final { 22 public: 23 StringHasher() = delete; 24 template <typename char_t> 25 static inline uint32_t HashSequentialString(const char_t* chars, int length, 26 uint64_t seed); 27 28 // Calculated hash value for a string consisting of 1 to 29 // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). 30 // value is represented decimal value. 31 static uint32_t MakeArrayIndexHash(uint32_t value, int length); 32 33 // No string is allowed to have a hash of zero. That value is reserved 34 // for internal properties. If the hash calculation yields zero then we 35 // use 27 instead. 36 static const int kZeroHash = 27; 37 38 // Reusable parts of the hashing algorithm. 39 V8_INLINE static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c); 40 V8_INLINE static uint32_t GetHashCore(uint32_t running_hash); 41 42 static inline uint32_t GetTrivialHash(int length); 43 }; 44 45 // Useful for std containers that require something ()'able. 46 struct SeededStringHasher { SeededStringHasherSeededStringHasher47 explicit SeededStringHasher(uint64_t hashseed) : hashseed_(hashseed) {} 48 inline std::size_t operator()(const char* name) const; 49 50 uint64_t hashseed_; 51 }; 52 53 // Useful for std containers that require something ()'able. 54 struct StringEquals { operatorStringEquals55 bool operator()(const char* name1, const char* name2) const { 56 return strcmp(name1, name2) == 0; 57 } 58 }; 59 60 } // namespace internal 61 } // namespace v8 62 63 #endif // V8_STRINGS_STRING_HASHER_H_ 64