19
19
/// * Daniel J. Bernstein <
[email protected] >
20
20
//===----------------------------------------------------------------------===//
21
21
22
- @_fixed_layout
23
- @usableFromInline
24
- internal struct _SipHashState {
25
- // "somepseudorandomlygeneratedbytes"
26
- fileprivate var v0 : UInt64 = 0x736f6d6570736575
27
- fileprivate var v1 : UInt64 = 0x646f72616e646f6d
28
- fileprivate var v2 : UInt64 = 0x6c7967656e657261
29
- fileprivate var v3 : UInt64 = 0x7465646279746573
30
- // These fields are reserved for future use.
31
- fileprivate var p0 : UInt64 = 0
32
- fileprivate var p1 : UInt64 = 0
33
- fileprivate var p2 : UInt64 = 0
34
- fileprivate var p3 : UInt64 = 0
22
+ extension Hasher {
23
+ @_fixed_layout
24
+ @usableFromInline
25
+ internal struct _State {
26
+ // "somepseudorandomlygeneratedbytes"
27
+ fileprivate var v0 : UInt64 = 0x736f6d6570736575
28
+ fileprivate var v1 : UInt64 = 0x646f72616e646f6d
29
+ fileprivate var v2 : UInt64 = 0x6c7967656e657261
30
+ fileprivate var v3 : UInt64 = 0x7465646279746573
31
+ // The fields below are reserved for future use. They aren't currently used.
32
+ fileprivate var v4 : UInt64 = 0
33
+ fileprivate var v5 : UInt64 = 0
34
+ fileprivate var v6 : UInt64 = 0
35
+ fileprivate var v7 : UInt64 = 0
35
36
36
- @inline ( __always)
37
- fileprivate init ( rawSeed: ( UInt64 , UInt64 ) ) {
38
- v3 ^= rawSeed. 1
39
- v2 ^= rawSeed. 0
40
- v1 ^= rawSeed. 1
41
- v0 ^= rawSeed. 0
37
+ @inline ( __always)
38
+ fileprivate init ( rawSeed: ( UInt64 , UInt64 ) ) {
39
+ v3 ^= rawSeed. 1
40
+ v2 ^= rawSeed. 0
41
+ v1 ^= rawSeed. 1
42
+ v0 ^= rawSeed. 0
43
+ }
42
44
}
45
+ }
43
46
47
+ extension Hasher . _State {
44
48
@inline ( __always)
45
49
fileprivate
46
50
static func _rotateLeft( _ x: UInt64 , by amount: UInt64 ) -> UInt64 {
@@ -50,19 +54,19 @@ internal struct _SipHashState {
50
54
@inline ( __always)
51
55
fileprivate mutating func _round( ) {
52
56
v0 = v0 &+ v1
53
- v1 = _SipHashState . _rotateLeft ( v1, by: 13 )
57
+ v1 = Hasher . _State . _rotateLeft ( v1, by: 13 )
54
58
v1 ^= v0
55
- v0 = _SipHashState . _rotateLeft ( v0, by: 32 )
59
+ v0 = Hasher . _State . _rotateLeft ( v0, by: 32 )
56
60
v2 = v2 &+ v3
57
- v3 = _SipHashState . _rotateLeft ( v3, by: 16 )
61
+ v3 = Hasher . _State . _rotateLeft ( v3, by: 16 )
58
62
v3 ^= v2
59
63
v0 = v0 &+ v3
60
- v3 = _SipHashState . _rotateLeft ( v3, by: 21 )
64
+ v3 = Hasher . _State . _rotateLeft ( v3, by: 21 )
61
65
v3 ^= v0
62
66
v2 = v2 &+ v1
63
- v1 = _SipHashState . _rotateLeft ( v1, by: 17 )
67
+ v1 = Hasher . _State . _rotateLeft ( v1, by: 17 )
64
68
v1 ^= v2
65
- v2 = _SipHashState . _rotateLeft ( v2, by: 32 )
69
+ v2 = Hasher . _State . _rotateLeft ( v2, by: 32 )
66
70
}
67
71
68
72
@inline ( __always)
@@ -71,27 +75,42 @@ internal struct _SipHashState {
71
75
}
72
76
}
73
77
74
- @usableFromInline
75
- @_fixed_layout
76
- internal struct _SipHash13Core {
77
- private var _state : _SipHashState
78
-
78
+ extension Hasher {
79
79
@usableFromInline
80
- @_effects ( releasenone)
81
- internal init ( rawSeed: ( UInt64 , UInt64 ) ) {
82
- _state = _SipHashState ( rawSeed: rawSeed)
80
+ @_fixed_layout
81
+ internal struct _Core {
82
+ private var _state : Hasher . _State
83
+
84
+ @inline ( __always)
85
+ internal init ( rawSeed: ( UInt64 , UInt64 ) ) {
86
+ _state = Hasher . _State ( rawSeed: rawSeed)
87
+ }
88
+ }
89
+ }
90
+
91
+ extension Hasher . _Core {
92
+ @inline ( __always)
93
+ internal init ( ) {
94
+ self . init ( rawSeed: Hasher . _executionSeed)
95
+ }
96
+
97
+ @inline ( __always)
98
+ internal init ( seed: Int ) {
99
+ let executionSeed = Hasher . _executionSeed
100
+ // Prevent sign-extending the supplied seed; this makes testing slightly
101
+ // easier.
102
+ let seed = UInt ( bitPattern: seed)
103
+ self . init ( rawSeed: (
104
+ executionSeed. 0 ^ UInt64 ( truncatingIfNeeded: seed) ,
105
+ executionSeed. 1 ) )
83
106
}
84
107
85
- @usableFromInline
86
- @_effects ( releasenone)
87
108
internal mutating func compress( _ m: UInt64 ) {
88
109
_state. v3 ^= m
89
110
_state. _round ( )
90
111
_state. v0 ^= m
91
112
}
92
113
93
- @usableFromInline
94
- @_effects ( releasenone)
95
114
internal mutating func finalize( tailAndByteCount: UInt64 ) -> UInt64 {
96
115
compress ( tailAndByteCount)
97
116
_state. v2 ^= 0xff
0 commit comments