# Хеширование {#hashing}

Такие <.localized_link href="/guides/features/cache">возможности</.localized_link>, как кэширование или выборочное тестирование, требуют способа определить, изменилась ли цель. Tuist вычисляет хеш для каждой цели в графе зависимостей, чтобы понять, была ли она изменена. Хеш рассчитывается на основе следующих атрибутов:

- Атрибуты цели (например, имя, платформа, продукт и т. д.)
- Файлы цели
- Хеш зависимостей цели

### Атрибуты кэша {#cache-attributes}

Кроме того, при вычислении хеша для <.localized_link href="/guides/features/cache">кэширования</.localized_link> мы также хешируем следующие атрибуты.

#### Версия Swift {#swift-version}

Мы хешируем версию Swift, полученную при выполнении команды `/usr/bin/xcrun swift --version`, чтобы предотвратить ошибки компиляции из-за несоответствия версий Swift между целями и бинарными файлами.

> [!NOTE]
> **Стабильность модулей**
>
> Предыдущие версии бинарного кэширования полагались на настройку сборки `BUILD_LIBRARY_FOR_DISTRIBUTION`, чтобы включить [стабильность модулей](https://www.swift.org/blog/library-evolution#enabling-library-evolution-support) и позволить использовать бинарные файлы с любой версией компилятора. Однако это вызывало проблемы компиляции в проектах с целями, которые не поддерживают стабильность модулей. Сгенерированные бинарные файлы привязаны к версии Swift, использованной для их компиляции, и версия Swift должна совпадать с той, которая использовалась для компиляции проекта.


#### Конфигурация {#configuration}

При вычислении хешей кэша Tuist ограничивает настройки каждого проекта и цели разрешённой конфигурацией сборки. Это та, которая указана с помощью `--configuration`, иначе используется `defaultConfiguration` проекта, иначе первая отладочная конфигурация. Tuist хеширует имя этой конфигурации, вариант, настройки сборки и содержимое файла конфигурации вместе с общими базовыми настройками, которые к ней применяются. Добавление, удаление или изменение другой конфигурации не влияет на хеши кэша разрешённой конфигурации. Поскольку важна только разрешённая конфигурация, кэш, заполненный с явным указанием `--configuration`, может быть прочитан командой, которая разрешает ту же конфигурацию без передачи флага.

## Отладка {#debugging}

Если вы заметили недетерминированное поведение при использовании кэширования в разных средах или при разных вызовах, это может быть связано с различиями между средами или ошибкой в логике хеширования. Мы рекомендуем выполнить следующие шаги для отладки проблемы:

1. Выполните `tuist hash cache` или `tuist hash selective-testing` (хеши для <.localized_link href="/guides/features/cache">бинарного кэширования</.localized_link> или <.localized_link href="/guides/features/selective-testing">выборочного тестирования</.localized_link>), скопируйте хеши, переименуйте каталог проекта и снова выполните команду. Хеши должны совпасть.
2. Если хеши не совпадают, вероятно, сгенерированный проект зависит от среды. Выполните `tuist graph --format json` в обоих случаях и сравните графы. В качестве альтернативы сгенерируйте проекты и сравните их файлы `project.pbxproj` с помощью инструмента diff, такого как [Diffchecker](https://www.diffchecker.com).
3. Если хеши одинаковы, но различаются в разных средах (например, CI и локальной), убедитесь, что везде используется одна и та же [конфигурация](#configuration) и одна и та же [версия Swift](#swift-version). Версия Swift привязана к версии Xcode, поэтому убедитесь, что версии Xcode совпадают.

Если хеши по-прежнему недетерминированы, сообщите нам об этом, и мы поможем с отладкой.


> [!NOTE]
> **Планируется улучшение опыта отладки**
>
> Улучшение нашего опыта отладки находится в нашем плане развития. Команда print-hashes, которой не хватает контекста для понимания различий, будет заменена более удобной командой, которая использует древовидную структуру для отображения различий между хешами.
