Slide 1

Slide 1 text

@gregheo SLUG August 2018 Everything The least you need to know about hashing in Swift (including Swift 4.2!) @gregheo {

Slide 2

Slide 2 text

@gregheo SLUG August 2018 extension Puppy { }

Slide 3

Slide 3 text

@gregheo SLUG August 2018 extension Puppy: Hashable { } { return 0 } var hashValue: Int

Slide 4

Slide 4 text

@gregheo SLUG August 2018 What is a hash? What are hash values used for? How do I calculate good hash values?

Slide 5

Slide 5 text

@gregheo SLUG August 2018 0 1 2 3 4 5 6 7 8 9 …

Slide 6

Slide 6 text

@gregheo SLUG August 2018 0 1 2 3 4 5 6 7 8 9 …

Slide 7

Slide 7 text

@gregheo SLUG August 2018

Slide 8

Slide 8 text

@gregheo SLUG August 2018

Slide 9

Slide 9 text

@gregheo SLUG August 2018 var hashValue: Int

Slide 10

Slide 10 text

@gregheo SLUG August 2018 Int data hash function

Slide 11

Slide 11 text

@gregheo SLUG August 2018 == hash hash == *

Slide 12

Slide 12 text

@gregheo SLUG August 2018 != hash hash != hash hash == possible!

Slide 13

Slide 13 text

@gregheo SLUG August 2018 Int data hash function

Slide 14

Slide 14 text

@gregheo SLUG August 2018 Int data hash function

Slide 15

Slide 15 text

@gregheo SLUG August 2018 != hash hash !=

Slide 16

Slide 16 text

@gregheo SLUG August 2018 hash hash == ==

Slide 17

Slide 17 text

@gregheo SLUG August 2018 == hash hash == hash hash != !=

Slide 18

Slide 18 text

@gregheo SLUG August 2018 extension Puppy: Hashable { } { return 0 } var hashValue: Int

Slide 19

Slide 19 text

@gregheo SLUG August 2018

Slide 20

Slide 20 text

@gregheo SLUG August 2018 0 1 2 3 4 5 6 7 8 9 …

Slide 21

Slide 21 text

@gregheo SLUG August 2018 extension Puppy: Hashable { var hashValue: Int {
 return 0
 } }

Slide 22

Slide 22 text

@gregheo SLUG August 2018 extension Puppy: Hashable { var hashValue: Int { return Int(arc4random_uniform(1000))
 } }

Slide 23

Slide 23 text

@gregheo SLUG August 2018 var hashValue: Int { return age.hashValue ^ name.hashValue
 }

Slide 24

Slide 24 text

@gregheo SLUG August 2018 struct Puppy: Hashable { let name: String let age: Int
 } struct RedPanda: Hashable { let name: String let sequence: Int
 }

Slide 25

Slide 25 text

@gregheo SLUG August 2018 let p1 = Puppy(name: "Boba", age: 8)
 let p2 = RedPanda(name: "Boba", sequence: 8)
 p1.hashValue p2.hashValue // 7824938159186139988 // 7824938159186139988

Slide 26

Slide 26 text

@gregheo SLUG August 2018 var hashValue: Int { return age.hashValue ^
 name.hashValue ^ “Puppy”.hashValue
 }

Slide 27

Slide 27 text

@gregheo SLUG August 2018 func hash(into hasher: inout Hasher) { hasher.combine(age) hasher.combine(name) } N E W !

Slide 28

Slide 28 text

@gregheo SLUG August 2018 struct Puppy: Hashable { let name: String let age: Int
 }

Slide 29

Slide 29 text

@gregheo SLUG August 2018 What is a hash? What are hash values used for? How do I calculate good hash values?

Slide 30

Slide 30 text

@gregheo SLUG August 2018 swiftunboxed.com/protocols/hashable/ }