@@ -2,32 +2,32 @@ import Foundation
22
33enum PostIDGenerator {
44 static func secretGenerator( from date: Date ) -> UInt64 {
5- let formatter = DateFormatter ( )
6- formatter. dateFormat = " yyyyMMddHHmm "
7- let dateString = formatter. string ( from: date)
8- let noise = UInt64 ( dateString) ?? 0
9- return noise
5+ var calendar = Calendar ( identifier: . gregorian)
6+ calendar. timeZone = TimeZone ( identifier: " UTC " ) !
7+ let comps = calendar. dateComponents ( [ . year, . month, . day, . hour, . minute] , from: date)
8+
9+ let str = String ( format: " %04d%02d%02d%02d%02d " ,
10+ comps. year!, comps. month!, comps. day!,
11+ comps. hour!, comps. minute!)
12+ return UInt64 ( str) ?? 0
1013 }
1114
1215 static func derivePostID( profileID: UUID , timestamp: Date , counter: UInt8 ) -> UUID {
1316 let noise = secretGenerator ( from: timestamp)
1417 let combinedNoise = ( noise << 8 ) | UInt64 ( counter)
15- var left = Array ( profileID. uuidString. utf8)
16- var right = String ( combinedNoise)
1718
18- while right. count < 32 {
19- right. append ( " 0 " )
20- }
19+ var left = Array ( profileID. uuidString. utf8. prefix ( 32 ) )
20+ while left. count < 32 { left. append ( 0 ) }
2121
22+ let right = String ( format: " %032llu " , combinedNoise)
2223 let center = Array ( right. utf8. prefix ( 32 ) )
23- while left. count < 32 {
24- left. append ( 0 )
25- }
2624
2725 let combined = zip ( left, center) . map { $0 ^ $1 }
28- let hex = combined. map { String ( format : " %02x " , $0) } . joined ( )
26+ let hex = combined. map { hexLookup [ Int ( $0) ] } . joined ( )
2927 let uuidString = " \( hex. prefix ( 8 ) ) - \( hex. dropFirst ( 8 ) . prefix ( 4 ) ) - \( hex. dropFirst ( 12 ) . prefix ( 4 ) ) - \( hex. dropFirst ( 16 ) . prefix ( 4 ) ) - \( hex. dropFirst ( 20 ) . prefix ( 12 ) ) "
3028
3129 return UUID ( uuidString: uuidString) ?? UUID ( )
3230 }
31+
32+ private static let hexLookup : [ String ] = ( 0 ... 255 ) . map { String ( format: " %02x " , $0) }
3333}
0 commit comments