# ハッシュ計算 {#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` を実行し、グラフを比較してください。あるいは、プロジェクトを生成し、[Diffchecker](https://www.diffchecker.com) などのdiffツールを使用して `project.pbxproj` ファイルを比較してください。
3. ハッシュは同じでも環境間（例えばCIとローカル）で異なる場合、すべての場所で同じ [構成](#configuration) と [Swiftバージョン](#swift-version) が使用されていることを確認してください。SwiftバージョンはXcodeバージョンに紐付けられているため、Xcodeバージョンが一致していることを確認してください。

ハッシュが依然として非決定論的な場合は、お知らせください。デバッグをサポートいたします。


> [!NOTE]
> **より良いデバッグ体験を計画**
>
> デバッグ体験の改善はロードマップに含まれています。差異を理解するためのコンテキストに欠けるprint-hashesコマンドは、ツリー構造を使用してハッシュ間の差異を表示する、よりユーザーフレンドリーなコマンドに置き換えられます。
