But those all depend on the type being something for which they can define Hash.
It's really important to me that for HashSet<TrustedType>, if someone gives me one it actually works. I don't want to ever let someone give me a garbage HashSet<u32>, for example. I want to be able to trust it because I trust u32 and I trust HashSet.
(This is also why I was opposed to the "raw API": the current plan of having a raw table type is great, but a safe way to violate the invariants on a HashSet<u32> would, IMHO, have blown a huge hole in the whole "Aiming for correctness with types" thing.)