This is the way to create safe Hashable based on @rayfix’s talk.

In this case, there is no problem here because a hashValue is unique.

BadPoint(x: 2.0, y: 3.0) and BadPoint(x: 3.0, y: 2.0) are not same object, but they have a same hashValue. This is a problem.

As @rayfix mentioned in his talk, heap allocations are expensive compared to previous way! And looks a little bit ugly:(
This is what he did to avoid a collision.

This way uses FNV-1a hash as a hash algorithm.

The FNV-1a hash differs from the FNV-1 hash by only the order in which the multiply and XOR is performed

hash = FNV_offset_basis
for each byte_of_data to be hashed
    hash = hash XOR byte_of_data
    hash = hash × FNV_prime
return hash

FNV-1a hash in Wikipedia


The another interesting way to solve these problems is from Sourcery’s AutoHashable. But Sourcery create AutoHashable automatically. Awesome!!


Ref: