← Назад к вопросам

Что такое хеш-код?

1.6 Junior🔥 141 комментариев
#Dart#ООП и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое хеш-код?

Хеш-код — это числовое значение, полученное путем применения хеш-функции к объекту или данным. В контексте Dart и Flutter хеш-код используется для быстрого определения эквивалентности объектов и их размещения в хеш-таблицах, таких как Set и Map.

Основные концепции

Хеш-код решает две критические задачи:

  • Быстрое сравнение — вместо посимвольного сравнения двух строк, система сначала сравнивает их хеш-коды
  • Индексирование в коллекциях — Set и Map используют хеш-код для определения позиции элемента

Принципы хеш-кода

Хеш-функция должна соответствовать двум правилам:

  1. Консистентность: если два объекта равны (==), они должны иметь одинаковый хеш-код
  2. Распределение: хеш-коды должны распределяться равномерно для минимизации коллизий

Пример в Dart

class User {
  final String name;
  final int age;

  User(this.name, this.age);

  @override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is User &&
    runtimeType == other.runtimeType &&
    name == other.name &&
    age == other.age;

  @override
  int get hashCode => Object.hash(name, age);
}

final user1 = User('John', 30);
final user2 = User('John', 30);

print(user1 == user2);           // true
print(user1.hashCode == user2.hashCode); // true (обязательно!)

Использование в Set

Set использует хеш-коды для быстрого поиска дубликатов:

final users = <User>{};
users.add(User('John', 30));
users.add(User('Jane', 25));
users.add(User('John', 30)); // не добавится (дубликат)

print(users.length); // 2

Без правильно реализованного hashCode дубликаты не удаляются корректно:

// ❌ Неправильно
class BadUser {
  final String name;
  
  BadUser(this.name);
  
  @override
  bool operator ==(Object other) => other is BadUser && name == other.name;
  
  @override
  int get hashCode => 1; // ❌ Все объекты имеют одинаковый хеш-код!
}

final badUsers = {BadUser('John'), BadUser('John')};
print(badUsers.length); // 1 (работает, но медленно!)

Использование в Map

Map использует хеш-коды ключей для быстрого доступа:

final userMap = <User, String>{};
final user = User('John', 30);

userMap[user] = 'admin';
print(userMap[User('John', 30)]); // 'admin'

Object.hash() функция

Dart предоставляет удобную функцию для комбинирования хеш-кодов:

class Product {
  final String id;
  final String category;
  final double price;

  Product(this.id, this.category, this.price);

  @override
  int get hashCode => Object.hash(id, category, price);

  @override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is Product &&
    id == other.id &&
    category == other.category &&
    price == other.price;
}

Производительность

Хеш-коды критичны для производительности:

  • O(1) поиск в Set/Map с хорошо распределенными хеш-кодами
  • O(n) поиск при плохой хеш-функции (много коллизий)

Правила реализации

  • Всегда переопределяй hashCode при переопределении operator ==
  • Используй Object.hash() для комбинирования нескольких полей
  • Не должен зависеть от изменяемых полей
  • Помни о правиле: равные объекты → равные хеш-коды

Правильная реализация хеш-кода — основа эффективной работы с коллекциями в Dart и Flutter.