Why does Hashable require Equatable?

Yes, that's how Dictionary is implemented now. But my question is why it has to be in that way and isn't it too much berden on the user to make sure == and hashValue don't contradict each other.

I've experience the problem when I imported a 3rd party framework that happened to be implementing Equatable to the type of which I was using for a dictionary key. I implemented hashValue and == to the type, but the compiler didn't warn me there were two == functions to the type, and I needed to realize my == method wasn't called at runtime to figure out the bug.

Anyway, when two objects are not equal but have the same hashValue, what behavior should a user reasonably expect?

struct Foo { let n }
extension Foo: Equatable {
  static func == (lhs: Foo, rhs: Foo) -> Bool { return rhs.n == lhs.n }
}
extension Foo: Hashable {
  var hashValue: Int { return n / 2 }
}

var dict1 = [Foo: Int]()
dict1[Foo(n: 2)] = 2
dict1[Foo(n: 3)] = 3
print("\(dict1.count)")  // I was expecting this to be 1.