mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 06:33:51 +00:00 
			
		
		
		
	[core] Optimize fnv1_hash to avoid string allocations for static entities
This commit is contained in:
		| @@ -45,10 +45,15 @@ void EntityBase::set_icon(const char *icon) { | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Check if the object_id is dynamic (changes with MAC suffix) | ||||
| bool EntityBase::is_object_id_dynamic_() const { | ||||
|   return !this->flags_.has_own_name && App.is_name_add_mac_suffix_enabled(); | ||||
| } | ||||
|  | ||||
| // Entity Object ID | ||||
| std::string EntityBase::get_object_id() const { | ||||
|   // Check if `App.get_friendly_name()` is constant or dynamic. | ||||
|   if (!this->flags_.has_own_name && App.is_name_add_mac_suffix_enabled()) { | ||||
|   if (this->is_object_id_dynamic_()) { | ||||
|     // `App.get_friendly_name()` is dynamic. | ||||
|     return str_sanitize(str_snake_case(App.get_friendly_name())); | ||||
|   } | ||||
| @@ -58,7 +63,7 @@ std::string EntityBase::get_object_id() const { | ||||
| StringRef EntityBase::get_object_id_ref_for_api_() const { | ||||
|   static constexpr auto EMPTY_STRING = StringRef::from_lit(""); | ||||
|   // Return empty for dynamic case (MAC suffix) | ||||
|   if (!this->flags_.has_own_name && App.is_name_add_mac_suffix_enabled()) { | ||||
|   if (this->is_object_id_dynamic_()) { | ||||
|     return EMPTY_STRING; | ||||
|   } | ||||
|   // For static case, return the string or empty if null | ||||
| @@ -70,7 +75,10 @@ void EntityBase::set_object_id(const char *object_id) { | ||||
| } | ||||
|  | ||||
| // Calculate Object ID Hash from Entity Name | ||||
| void EntityBase::calc_object_id_() { this->object_id_hash_ = fnv1_hash(this->get_object_id()); } | ||||
| void EntityBase::calc_object_id_() { | ||||
|   this->object_id_hash_ = | ||||
|       fnv1_hash(this->is_object_id_dynamic_() ? this->get_object_id().c_str() : this->object_id_c_str_); | ||||
| } | ||||
|  | ||||
| uint32_t EntityBase::get_object_id_hash() { return this->object_id_hash_; } | ||||
|  | ||||
|   | ||||
| @@ -126,6 +126,9 @@ class EntityBase { | ||||
|   virtual uint32_t hash_base() { return 0L; } | ||||
|   void calc_object_id_(); | ||||
|  | ||||
|   /// Check if the object_id is dynamic (changes with MAC suffix) | ||||
|   bool is_object_id_dynamic_() const; | ||||
|  | ||||
|   StringRef name_; | ||||
|   const char *object_id_c_str_{nullptr}; | ||||
| #ifdef USE_ENTITY_ICON | ||||
|   | ||||
| @@ -142,11 +142,13 @@ uint16_t crc16be(const uint8_t *data, uint16_t len, uint16_t crc, uint16_t poly, | ||||
|   return refout ? (crc ^ 0xffff) : crc; | ||||
| } | ||||
|  | ||||
| uint32_t fnv1_hash(const std::string &str) { | ||||
| uint32_t fnv1_hash(const char *str) { | ||||
|   uint32_t hash = 2166136261UL; | ||||
|   for (char c : str) { | ||||
|     hash *= 16777619UL; | ||||
|     hash ^= c; | ||||
|   if (str) { | ||||
|     while (*str) { | ||||
|       hash *= 16777619UL; | ||||
|       hash ^= *str++; | ||||
|     } | ||||
|   } | ||||
|   return hash; | ||||
| } | ||||
|   | ||||
| @@ -155,7 +155,8 @@ uint16_t crc16be(const uint8_t *data, uint16_t len, uint16_t crc = 0, uint16_t p | ||||
|                  bool refout = false); | ||||
|  | ||||
| /// Calculate a FNV-1 hash of \p str. | ||||
| uint32_t fnv1_hash(const std::string &str); | ||||
| uint32_t fnv1_hash(const char *str); | ||||
| inline uint32_t fnv1_hash(const std::string &str) { return fnv1_hash(str.c_str()); } | ||||
|  | ||||
| /// Return a random 32-bit unsigned integer. | ||||
| uint32_t random_uint32(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user