今回は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-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9SGFzaGFibGUmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTA5ZDU5Y2QyMjkxZjhkMDEyMzFhODBjMTBlNTMwOWM0&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBLYXRhZ2lyaVNvJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1jMmJiYzJjYWE4ZThmYTEyZDk0YmIxZDIzMDU2MjlhNQ&blend-x=142&blend-y=486&blend-mode=normal&s=886b431400d267371faa074b519e4746)
Hashable - Qiita
Hashableプロトコルのリファレンスの意訳です。概要この型は整数のハッシュ値を提供します。Hashableプロトコルに準拠する型は辞書のキーや集合で使うことができます。標準ライブラリの多く…
コメント