RawValueがIntのenumを何かのインデックスとして使いたい時はhashValueじゃなくてrawValueを使いましょう
そうそう遭遇はしないと思いつつ、Swift 4.2になるとハッシュシードのランダム化により問題が起き得ます。
- RawValueがIntのenumであっても、rawValueがそのままhashValueではなくなる
- Swift 4.1までは、rawValue == hashValueという挙動だった(実装依存)
- 実行ごとにハッシュ値は変わる
hashValueは「ダメ。ゼッタイ。」
The standard library now uses a high-quality, randomly seeded, universal hash function, represented by the new Hasher struct. Random seeding varies the result of hashValue on each execution of a program, improving the reliability of the standard library's hashed collections, Set and Dictionary. In particular, random seeding enables better protection against (accidental or deliberate) hash-flooding attacks.