mirror of
https://github.com/esphome/esphome.git
synced 2025-09-07 05:42:20 +01:00
[core] Optimize fnv1_hash to avoid string allocations for static entities (#10529)
This commit is contained in:
@@ -45,10 +45,15 @@ void EntityBase::set_icon(const char *icon) {
|
|||||||
#endif
|
#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
|
// Entity Object ID
|
||||||
std::string EntityBase::get_object_id() const {
|
std::string EntityBase::get_object_id() const {
|
||||||
// Check if `App.get_friendly_name()` is constant or dynamic.
|
// 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.
|
// `App.get_friendly_name()` is dynamic.
|
||||||
return str_sanitize(str_snake_case(App.get_friendly_name()));
|
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 {
|
StringRef EntityBase::get_object_id_ref_for_api_() const {
|
||||||
static constexpr auto EMPTY_STRING = StringRef::from_lit("");
|
static constexpr auto EMPTY_STRING = StringRef::from_lit("");
|
||||||
// Return empty for dynamic case (MAC suffix)
|
// 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;
|
return EMPTY_STRING;
|
||||||
}
|
}
|
||||||
// For static case, return the string or empty if null
|
// 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
|
// 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_; }
|
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; }
|
virtual uint32_t hash_base() { return 0L; }
|
||||||
void calc_object_id_();
|
void calc_object_id_();
|
||||||
|
|
||||||
|
/// Check if the object_id is dynamic (changes with MAC suffix)
|
||||||
|
bool is_object_id_dynamic_() const;
|
||||||
|
|
||||||
StringRef name_;
|
StringRef name_;
|
||||||
const char *object_id_c_str_{nullptr};
|
const char *object_id_c_str_{nullptr};
|
||||||
#ifdef USE_ENTITY_ICON
|
#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;
|
return refout ? (crc ^ 0xffff) : crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t fnv1_hash(const std::string &str) {
|
uint32_t fnv1_hash(const char *str) {
|
||||||
uint32_t hash = 2166136261UL;
|
uint32_t hash = 2166136261UL;
|
||||||
for (char c : str) {
|
if (str) {
|
||||||
hash *= 16777619UL;
|
while (*str) {
|
||||||
hash ^= c;
|
hash *= 16777619UL;
|
||||||
|
hash ^= *str++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return hash;
|
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);
|
bool refout = false);
|
||||||
|
|
||||||
/// Calculate a FNV-1 hash of \p str.
|
/// 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.
|
/// Return a random 32-bit unsigned integer.
|
||||||
uint32_t random_uint32();
|
uint32_t random_uint32();
|
||||||
|
Reference in New Issue
Block a user