Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unsafe Swift
Search
Ray Fix
March 02, 2017
Programming
3
460
Unsafe Swift
Case study of using unsafe to implement hashable type. Presented at try! Swift 2017 Tokyo, Japan.
Ray Fix
March 02, 2017
Tweet
Share
More Decks by Ray Fix
See All by Ray Fix
アルゴリズムを通じて よりよいアプリを
rayfix
6
2.4k
メモリー管理の嬉しいバイキング料理
rayfix
7
6k
Other Decks in Programming
See All in Programming
Namespace, What and Why
tagomoris
4
770
ts-morphを使ってコードリプレイスとASTへのハードルを下げる!
nyawach
5
330
Embedding it into Ruby code
soutaro
2
410
仕様と実装で学ぶOpenTelemetry
drumato
2
1.2k
スタックトレース始めてみた
kuro_kurorrr
5
1.2k
The Design of Everyday APIs - PyCon 2024
roguelynn
1
220
2024 コーディング研修
ckazu
2
670
How to improve maintainability and readability of your automated tests? ( #scrumniigata )
teyamagu
PRO
1
130
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
350
Unlocking Potential of Property Based Testing with Ractor
ohbarye
2
350
RustでAWS Lambda functionをいい感じに書く
taiki45
2
160
勉強会4_アップデートされたAssistantsAPIを試す
milky04
0
110
Featured
See All Featured
How to Ace a Technical Interview
jacobian
273
22k
Docker and Python
trallard
35
2.7k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.7k
Rebuilding a faster, lazier Slack
samanthasiow
74
8.3k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
YesSQL, Process and Tooling at Scale
rocio
165
13k
Ruby is Unlike a Banana
tanoku
96
10k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
RailsConf 2023
tenderlove
9
590
Debugging Ruby Performance
tmm1
70
11k
Unsuck your backbone
ammeep
664
57k
4 Signs Your Business is Dying
shpigford
176
21k
Transcript
THE SAFETY OF UNSAFE SWIFT @RAYFIX ⚡ try! Swift Japan
2017 1
UB UNDEFINED BEHAVIOR 2
UNDEFINED SCHEDULE = 3
SWIFT SAFETY 4
WORKING WITH C PERFORMANCE LOW LEVEL 5
SWIFT POINTERS UnsafeMutableRawBufferPointer<Pointee> Mutable Raw Buffer <Pointee> 6
7
O(1) CONSTANT TIME LOOKUP DICTIONARIES AND SETS8
O(N) LINEAR TIME LOOKUP BAD HASH O(1) 9
struct Angle: Hashable { var radians: Double … var hashValue:
Int { return radians.hashValue } } ANGLE 10
struct Point: Hashable { var x, y: Double var hashValue:
Int { return x.hashValue ^ y.hashValue } } ^ COMPOSITION 11
struct Point: Hashable { var x, y: Double var hashValue:
Int { return "\(x),\(y)".hashValue } } FAKE IT Heap Allocations are Expensive! 12
protocol HashAlgorithm { init() // 1 mutating func consume(bytes:) //
2 var finalValue: Int // 3 } ROBUST COMPOSITION13
struct FVN1AHash: HashAlgorithm { private var hash: UInt64 = 0xcbf29ce484222325
private let prime: UInt64 = 0x100000001b3 mutating func consume<S: Sequence>(bytes: S) where S.Iterator.Element == UInt8 { for byte in bytes { hash = (hash ^ UInt64(byte)) &* prime } } var finalValue: Int { return Int(truncatingBitPattern: hash) } } HASH ALGO AUTHORS14
var hashValue: Int { var hash = FVN1AHash() hash.consume(x) hash.consume(y)
return hash.finalValue } SAFE EASY CLIENT CODE15
UNSAFE CODE SAFELY HIDDEN AWAY extension HashAlgorithm { mutating func
consume<I: Integer>(_ value: I) { var temp = value withUnsafeBytes(of: &temp) { rawBufferPointer in consume(bytes: rawBufferPointer) } } } 16
Safe, Swifty API for Users Safe Customization Points for Library
Developers Well Tested Unsafe Code UNSAFE CODE SAFELY HIDDEN AWAY 17
18