[squeak-dev] The Inbox: Network-topa.166.mcz

Tobias Pape Das.Linux at gmx.de
Wed Oct 21 18:29:27 UTC 2015


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, commits at source.squeak.org 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.!
> 
> 



More information about the Squeak-dev mailing list