[squeak-dev] The Inbox: Network-topa.166.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Oct 21 18:26:24 UTC 2015
Tobias Pape uploaded a new version of Network to project The Inbox:
http://source.squeak.org/inbox/Network-topa.166.mcz
==================== Summary ====================
Name: Network-topa.166
Author: topa
Time: 21 October 2015, 8:26:14.656 pm
UUID: d6d9910f-fa67-4c69-9a89-030c81233e90
Ancestors: Network-topa.165
UUIDGenerator
- Use new Random>>#nextBytes:into:startingAt: (needs Kernel-ul.960) for even more speed
- Fix UUIDGenerator class>>#initialize to correctly register at startup
- Do not reset default on startup but rather reseed TheRandom
Timings improved: '1,190,000 per second. 842 nanoseconds per run.' (0.25 times slower than primitive version)
=============== Diff against Network-topa.165 ===============
Item was changed:
Object subclass: #UUIDGenerator
+ instanceVariableNames: ''
- instanceVariableNames: 'bits'
classVariableNames: 'Default TheRandom TheSemaphore'
poolDictionaries: ''
category: 'Network-UUID'!
!UUIDGenerator commentStamp: 'topa 10/19/2015 23:23:19' prior: 0!
I generate a pseudo-random UUID by asking Random for a 128 bit value.
See https://tools.ietf.org/html/rfc4122.html#section-4.4 for reference.!
Item was changed:
----- Method: UUIDGenerator class>>default (in category 'instance creation') -----
default
+ ^ Default ifNil: [Default := self new]
+ !
- Default ifNil: [self generateDefault].
- ^Default!
Item was removed:
- ----- Method: UUIDGenerator class>>generateDefault (in category 'instance creation') -----
- generateDefault
- Default := self new!
Item was changed:
----- Method: UUIDGenerator class>>initialize (in category 'class initialization') -----
initialize
TheRandom := Random new.
TheSemaphore := Semaphore forMutualExclusion.
+ Smalltalk addToStartUpList: self!
- Smalltalk addToStartUpList: self after: nil.!
Item was added:
+ ----- Method: UUIDGenerator class>>resetDefault (in category 'class initialization') -----
+ resetDefault
+ Default := nil.!
Item was changed:
----- Method: UUIDGenerator class>>startUp (in category 'class initialization') -----
startUp
+ "Reseed the random"
+ TheSemaphore critical: [TheRandom seed: nil].!
- Default := nil!
Item was added:
+ ----- Method: UUIDGenerator>>fillRandomly: (in category 'instance creation') -----
+ fillRandomly: aUUID
+
+ TheSemaphore critical: [
+ TheRandom nextBytes: 16 "128 bit" into: aUUID startingAt: 1].!
Item was changed:
----- Method: UUIDGenerator>>generateBytes:forVersion: (in category 'instance creation') -----
+ generateBytes: aUUID forVersion: aVersion
+ | versionID fixedValue |
+
+ aVersion = 4 ifFalse: [^ self error: 'Unsupported version'].
+
+ self fillRandomly: aUUID.
+ versionID := ((aUUID at: 7) bitAnd: 16r0F) bitOr: 16r40. "Version 4"
+ fixedValue := ((aUUID at: 9) bitAnd: 16r3F) bitOr: 16r80. "Fixed 8..b value"
+ aUUID
+ at: 7 put: versionID;
+ at: 9 put: fixedValue.!
- generateBytes: aPlaceHolder forVersion: aVersion
- aVersion = 4 ifTrue: [self generateFieldsVersion4]
- ifFalse: [self error: 'Unsupported version'].
- self placeFields: aPlaceHolder.!
Item was removed:
- ----- Method: UUIDGenerator>>generateFieldsVersion4 (in category 'instance creation') -----
- generateFieldsVersion4
-
- TheSemaphore critical: [
- bits := 16rffffffffffffffffffffffffffffffff atRandom: TheRandom. "128 bit"].!
Item was removed:
- ----- Method: UUIDGenerator>>placeFields: (in category 'instance creation') -----
- placeFields: aByteArray
-
- | version fixed |
- bits isLarge
- ifTrue: [ aByteArray replaceFrom: 1 to: bits size with: bits]
- ifFalse: [aByteArray unsignedLongAt: 1 put: bits bigEndian: false].
-
- version := ((aByteArray at: 7) bitAnd: 16r0F) bitOr: 16r40. "Version 4"
- fixed := ((aByteArray at: 9) bitAnd: 16r3F) bitOr: 16r80. "Fixed 8..b value"
- aByteArray
- at: 7 put: version;
- at: 9 put: fixed.!
More information about the Squeak-dev
mailing list
|