[swift-evolution] Pluggable hash algorithm for containers
Ray Fix
rayfix at gmail.com
Fri Dec 4 12:45:45 CST 2015
> On Dec 3, 2015, at 8:29 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
>
> A prototype is here (written before Howard's talk, so it probably uses
> different terms):
>
> https://github.com/apple/swift/blob/master/validation-test/stdlib/HashingPrototype.swift
>
Thank your for the excellent pointer, Dmitri. I will look into that as I get setup to build, test, and make actual changes.
> However, I couldn't make it interoperate with NSObject.hash in both
> directions: you should be able to override 'var hash' and get an
> implementation of Hashable based on that, and vice versa. It could be
> solvable with protocol extensions now, I haven't looked at that
> prototype for more than a year -- help and patches appreciated.
>
As you know, a hashing algorithm just needs to consume raw bytes. The HasherType protocol could use protocol extensions to provide a clean API to standard types like Int and Float, Double, String, Bool, UInt32, Sequences, etc.
extension CGPoint : NewHashable {
func combineInto(hasher: Hasher) {
x.combineInto(hasher)
y.combineInto(hasher)
}
What would be even better is if there was some interspection with a default implementation so the user code could look like this:
extension CGPoint : NewHashable {}
but that is dependent on another language feature.
The default implementation of hash is to call combineInto(Hasher) with a legacy hasher and immediately squeeze. Might even want this to be statically dispatched (an extension with no protocol definition).
extension NewHashable {
var hash: Int {
var h = LegacyHasher()
self.combineInto(h)
return h.squeezeHashValue()
}
}
Any thoughts?
Ray
More information about the swift-evolution
mailing list