> > On Windows (10) (with latest 6 image and VM) `Time microsecondClockValue` 
> > returns microseconds, but (presumably the system) cannot give precision 
> > beyond 1 second - this will imho need a VM fix;
> 
> I find that quite hard to believe and I did not know that. Are you really 
> sure ? That would be terrible. A solution might be to use another clock 
> primitive.
> 
> > I can also generate about 1.2M UUIDs per second (limited by single core I 
> > guess), which means that about every 600-1200 consequential UUIDs will have 
> > the same clock value.
> 
> I can't follow your reasoning here: if the clock precision would be 1 second, 
> you would get 1.2M consecutive UUIDs with the same clock value, right ?

Whoops, I meant the precision on a millisecond, not second... thus the ~1000k 
consecutive clock values.
The returned value is still in microseconds, but the last 3 digits are fixed 
(they are different on startup, but same during execution).

I faintly remember having the same issue in a different language years ago, 
because they had different APIs or some bullshit like that.

So when I generate e.g. 10 random UUIDs I get:


(1 to: 10) collect: [ :i | NeoUUIDGenerator next ]. "an Array(
an UUID('349b2ccc-4404-0d00-a8e7-5c9c0ef2da37')
an UUID('349b2ccc-4404-0d00-a8e8-2f3a0ef2da37')
an UUID('349b2ccc-4404-0d00-a8e9-9e0b0ef2da37')
an UUID('349b2ccc-4404-0d00-a8ea-15520ef2da37')
an UUID('349b2ccc-4404-0d00-a8eb-fa5c0ef2da37')
an UUID('349b2ccc-4404-0d00-a8ec-d25f0ef2da37')
an UUID('349b2ccc-4404-0d00-a8ed-6a590ef2da37')
an UUID('349b2ccc-4404-0d00-a8ee-3a8d0ef2da37')
an UUID('349b2ccc-4404-0d00-a8ef-0ad20ef2da37')
an UUID('349b2ccc-4404-0d00-a8f0-7bda0ef2da37'))"

> 
> In the unit tests this is verified (that the time value goes forward on 
> consecutive calls).
> 

testTwo*Generator only tests if they are close, not that one is higher than the 
other,

if I add

self assert: time2 equals: time1.

the test will still pass (but that is already obvious from the list above).



> > 9 & 10 bytes are counter, but 9th bit is rewritten with variant, so the 
> > counter is actually 0-255 and not 0-65536.
> 
> Yes, but more correctly, the top 2 bits are set to 10, making the range 1 to 
> 2^14 (16384) (instead of 2^16). 

Welp, I can't do bit math.

> 
> > And finally 11 & 12 are random bits (assuming the seeding isn't broken).
> 
> The seeding is one aspect (the quality of the seed), the algorithm is another.
> Note that in the current Random class, the seed is initialised using the 
> clock as well.

The problem with Random is not the time-based initialization, but masking of 
the initial value (which is mentioned in the originally linked thread on 
randomness, which fixes itself upon further generations).

> 
> > So on Windows, the conditional probability that nth and n+256th UUIDs will 
> > be identical is imho 1/65536 (assuming they are in the same second, which 
> > is easy).
> 
> I am pretty/quite sure this is not correct but it would take me much more 
> time to come up with a more correct calculation.

With the actual counter I would have to generate 16384 UUID/milisecond, which 
unlike 256/ms I cannot do, so it is safe again. :) (well... until Pharo goes 
multicore)

> 
> BTW, you also have to define the context of being the same: the same instance 
> of one NeoUUIDGenerator generating the same UUID, or several different 
> generator instances, in the same image, in different images, on different 
> runs, the same or different machines/networks, ... 
> 
> > On Linux my understanding is that clash can only happen if NTP adjusts my 
> > clock during UUID generation (at which point it is same as Windows).
> > 
> > Can UUID clash be achieved on Linux if you deploy copies of the same image 
> > and let them all generate UUIDs? (It should be again 1/65536).

Yeah, across machines the last four bytes behave randomly too.

Maybe I can get clash if I run two random generators in forks (to fix 14 bits 
of counter randomness :) ... but no time for that now. :)

Peter

Reply via email to