今回はHashable
プロトコルについて説明していきます。
そもそもHashとは?
一般的にHash(ハッシュ値)とは一つ一つのデータを識別したり比較するために与えられる、一意の文字列または数字です。
ハッシュ値は以下の2つの性質を持つ必要があります。
- 一意性:異なるデータには異なるハッシュ値が与えられる
- 不可逆性:ハッシュ値から元のデータに変換することはできない
以上のような性質から、ハッシュ値はデータの改竄や破損検知、整合性チェックなどに使われます。
じゃあHashableとは?
とは Hash + able(可能) =「ハッシュ値の使用ができる」ということです。XcodeでHashable
の定義を見てみると、hashValue
というプロパティとhash
というメソッドを持っていることを確認できます。
![](https://shuhey-hashimoto.com/wp-content/uploads/2021/08/スクリーンショット-2021-08-16-23.02.39.png)
コメントを読んでみると、
`hashValue`は` Hashable`要件として非推奨になりました。 `Hashable`に準拠するには、代わりに` hash(into:) `要件を実装します。
とのことで、
は非推奨になったようですね。hashValue
Hashableへの準拠が必要なパターン
ハッシュ値を用いた処理が必要な型の場合は、その型をHashableに準拠させる必要があります。例えばDictionary、ForEach、Setなどではハッシュ値を使用します。それぞれについてみてみましょう。
![](https://shuhey-hashimoto.com/wp-content/uploads/2021/08/スクリーンショット-2021-08-16-23.32.38.png)
![](https://shuhey-hashimoto.com/wp-content/uploads/2021/08/スクリーンショット-2021-08-16-23.36.32.png)
![](https://shuhey-hashimoto.com/wp-content/uploads/2021/08/スクリーンショット-2021-08-16-23.35.42.png)
それぞれ、Key,ID,ElementがHashable
なことがわかりますね。
DictionaryのKeyに設定したり、ForEachでidを使用して処理を回したり、Setに格納する場合は以下のようにHashable
に準拠させるようにしましょう。
struct Person: Hashable {
let name: String
let age: Int
}
参考サイト
以下のサイトを参考にさせていただきました。ありがとうございます。
![](https://shuhey-hashimoto.com/wp-content/uploads/cocoon-resources/blog-card-cache/8c8f6e4facf0020077138aac5f26c7f0.jpg)
Hashable | Apple Developer Documentation
A type that can be hashed into a to produce an integer hash value.
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9SGFzaGFibGUmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWUwNTNmMzJhOTE4YzYyMGM2YjMzNGQ3NjBjNTVhYzE3&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwS2F0YWdpcmlTbyZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9Mjk2YTdmYWYxNWIwOWJkNjRmYjdiYmE4YTUwNjliZjA&blend-x=142&blend-y=491&blend-mode=normal&s=04374c04014bf8e98c4780b81df9b278)
Hashable - Qiita
Hashableプロトコルのリファレンスの意訳です。概要この型は整数のハッシュ値を提供します。Hashableプロトコルに準拠する型は辞書のキーや集合で使うことができます。標準ライブラリの多く…
コメント