// Copyright 2017 the V8 project 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 V8_STRING_HASHER_H_ #define V8_STRING_HASHER_H_ #include "src/globals.h" namespace v8 { namespace internal { class ConsString; class String; template class Vector; class V8_EXPORT_PRIVATE StringHasher { public: explicit inline StringHasher(int length, uint32_t seed); template static inline uint32_t HashSequentialString(const schar* chars, int length, uint32_t seed); // Reads all the data, even for long strings and computes the utf16 length. static uint32_t ComputeUtf8Hash(Vector chars, uint32_t seed, int* utf16_length_out); // Calculated hash value for a string consisting of 1 to // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). // value is represented decimal value. static uint32_t MakeArrayIndexHash(uint32_t value, int length); // No string is allowed to have a hash of zero. That value is reserved // for internal properties. If the hash calculation yields zero then we // use 27 instead. static const int kZeroHash = 27; // Reusable parts of the hashing algorithm. INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c)); INLINE(static uint32_t GetHashCore(uint32_t running_hash)); INLINE(static uint32_t ComputeRunningHash(uint32_t running_hash, const uc16* chars, int length)); INLINE(static uint32_t ComputeRunningHashOneByte(uint32_t running_hash, const char* chars, int length)); protected: // Returns the value to store in the hash field of a string with // the given length and contents. uint32_t GetHashField(); // Returns true if the hash of this string can be computed without // looking at the contents. inline bool has_trivial_hash(); // Adds a block of characters to the hash. template inline void AddCharacters(const Char* chars, int len); private: // Add a character to the hash. inline void AddCharacter(uint16_t c); // Update index. Returns true if string is still an index. inline bool UpdateIndex(uint16_t c); int length_; uint32_t raw_running_hash_; uint32_t array_index_; bool is_array_index_; bool is_first_char_; DISALLOW_COPY_AND_ASSIGN(StringHasher); }; class IteratingStringHasher : public StringHasher { public: static inline uint32_t Hash(String* string, uint32_t seed); inline void VisitOneByteString(const uint8_t* chars, int length); inline void VisitTwoByteString(const uint16_t* chars, int length); private: inline IteratingStringHasher(int len, uint32_t seed); void VisitConsString(ConsString* cons_string); DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher); }; } // namespace internal } // namespace v8 #endif // V8_STRING_HASHER_H_