I would say it is an advanced use because it is an optimisation and in addition an optimisation that requires a lot of knowledge of the fields to be certain that a reduced hash is going to be good enough.
The optimisation doesn’t have a great history, for example in Java they used to hash only the 1st 6 characters of a string. However this was exploited in denial of service attacks that generated a vast number of strings with the same hash value, i.e same 1st 6 characters, that then overwhelmed the dictionary (map in Java) used in the web server software to store logins. So it wouldn’t be something I would encourage people to do or even worse do by accident. -- Howard. > On 16 Dec 2017, at 3:36 pm, Tony Allevato <tony.allev...@gmail.com> wrote: > > > >> On Fri, Dec 15, 2017 at 6:41 PM Howard Lovatt <howard.lov...@gmail.com> >> wrote: >> I think that is an advanced use, rather than a common use. I would prefer >> that to be something you manually code. > > But why? Why should implementing a subset of fields for hashValue require a > developer to also manually implement == when the default synthesized version > would be perfectly fine? The relationship between Equatable and Hashable does > not go both ways. > > In fact, requiring that they do so is *more* error prone because now they're > being forced to implement something that the compiler would have otherwise > generated for them. > > >> >> >> -- Howard. >> >>> On 16 Dec 2017, at 7:08 am, Tony Allevato <tony.allev...@gmail.com> wrote: >>> >>> >>> >>>> On Fri, Dec 15, 2017 at 11:39 AM Howard Lovatt via swift-evolution >>>> <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> 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> 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 >>>> >> 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
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution