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.! |
Hi all
I hope this version is an improvement over the last attempt :) Levente, is this way of using the Random generator useful? That is, Class-wide, guarded with a Semaphore and re-seeded at image startup? Best regards -Tobias On 21.10.2015, at 18:26, [hidden email] wrote: > 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.! > > |
Hi Tobias,
Yes, it looks good. Levente On Wed, 21 Oct 2015, Tobias Pape wrote: > Hi all > > I hope this version is an improvement over the last attempt :) > Levente, is this way of using the Random generator useful? > That is, Class-wide, guarded with a Semaphore and re-seeded at > image startup? > > Best regards > -Tobias > > On 21.10.2015, at 18:26, [hidden email] wrote: > >> 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.! >> >> > > > |
Free forum by Nabble | Edit this page |