@regexident has a long-standing proposal about how to do hashing better that 
would address this: 

https://gist.github.com/regexident/1b8e84974da2243e5199e760508d2d25 
<https://gist.github.com/regexident/1b8e84974da2243e5199e760508d2d25>

Dave

> On Dec 15, 2017, at 2:04 PM, T.J. Usiyan via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Can we provide a 'standard' method/function that can be used to combine 
> ordered hash values (`[Int] -> Int`)? That could make manually implementing 
> `hashValue` less burdensome.
> 
> TJ
> 
> On Fri, Dec 15, 2017 at 12:08 PM, Tony Allevato via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
> 
> On Fri, Dec 15, 2017 at 11:39 AM Howard Lovatt via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> +1
> I think the simple solution of if you provide either == or hashValue you have 
> to provide both is the best approach. Good catch of this bug.
> -- Howard.
> 
> That would be a significant usability hit to a common use case. There are 
> times where a value is composed of N fields where N is large-ish, and 
> equality is dependent on the values of all N fields but the hash value only 
> needs to be "good enough" by considering some subset of those fields (to make 
> computing it more efficient).
> 
> That still satisfies the related relationship between == and hashValue, but a 
> user wanting to explicitly implement a more efficient hashValue should *not* 
> necessarily be required to explicitly write the same == that would be 
> synthesized for them in that case.
> 
>  
> 
> > On 16 Dec 2017, at 6:24 am, Daniel Duan via swift-evolution 
> > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> >
> > +1. The proposal wasn’t explicit enough to have either supported or be 
> > against this IMO. It’s a sensible thing to spell out.
> >
> > Daniel Duan
> > Sent from my iPhone
> >
> >> On Dec 15, 2017, at 9:58 AM, Joe Groff via swift-evolution 
> >> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> >>
> >> SE-0185 is awesome, and brings the long-awaited ability for the compiler 
> >> to provide a default implementation of `==` and `hashValue` when you don't 
> >> provide one yourself. Doug and I were talking the other day and thought of 
> >> a potential pitfall: what should happen if you provide a manual 
> >> implementation of `==` without also manually writing your own `hashValue`? 
> >> It's highly likely that the default implementation of `hashValue` will be 
> >> inconsistent with `==` and therefore invalid in a situation like this:
> >>
> >> struct Foo: Hashable {
> >> // This property is "part of the value"
> >> var involvedInEquality: Int
> >> // This property isn't; maybe it's a cache or something like that
> >> var notInvolvedInEquality: Int
> >>
> >> static func ==(a: Foo, b: Foo) -> Bool {
> >>   return a.involvedInEquality == b.involvedInEquality
> >> }
> >> }
> >>
> >> As currently implemented, the compiler will still give `Foo` the default 
> >> hashValue implementation, which will use both of `Foo`'s properties to 
> >> compute the hash, even though `==` only tests one. This could be 
> >> potentially dangerous. Should we suppress the default hashValue derivation 
> >> when an explicit == implementation is provided?
> >>
> >> -Joe
> >> _______________________________________________
> >> swift-evolution mailing list
> >> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> >> https://lists.swift.org/mailman/listinfo/swift-evolution 
> >> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> > _______________________________________________
> > swift-evolution mailing list
> > swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> > https://lists.swift.org/mailman/listinfo/swift-evolution 
> > <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to