This relates to this question. I am using this answer to generate UUID in JavaScript:
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
This solution appeared to be working fine, however i am getting collisions. Here's what i have:
- A web-app running in Google Chrome.
- 16 users.
- about 4000 UUIDs have been generated in the past 2 months by these users.
- i got about 20 collisions - e.g. new UUID genereated today was the same as about 2 months ago (different user).
So the questions are:
- What's causing the issue?
- How can i avoid it?
The answer that originally posted this UUID solution was updated on 2017-06-28:
I wanted to post this as a comment to your question, but apparently StackOverflow won't let me.
I just ran a rudimentary test of 100,000 iterations in Chrome using the UUID algorithm you posted and got no collisions. Here's a code snippet:
Are you sure there isn't something else going on here?
Indeed there are collisions but only under Google Chrome. Check out my experience on the topic here
http://devoluk.com/google-chrome-math-random-issue.html
Seems like collisions only happen on the first few calls of Math.random. Cause if you just run the createGUID / testGUIDs method above (which obviously was the first thing I tried) it just works with no collisions whatsoever.
So to make a full test one needs to restart Google Chrome, generate 32 byte, restart Chrome, generate, restart, generate...
My best guess is that
Math.random()
is broken on your system for some reason (bizarre as that sounds). This is the first report I've seen of anyone getting collisions.node-uuid
has a test harness that you can use to test the distribution of hex digits in that code. If that looks okay then it's notMath.random()
, so then try substituting the UUID implementation you're using into theuuid()
method there and see if you still get good results.[Update: Just saw Veselin's report about the bug with
Math.random()
at startup. Since the problem is only at startup, thenode-uuid
test is unlikely to be useful. I'll comment in more detail on the devoluk.com link.]Just so that other folks can be aware of this - I was running into a surprisingly large number of apparent collisions using the UUID generation technique mentioned here. These collisions continued even after I switched to seedrandom for my random number generator. That had me tearing my hair out, as you can imagine.
I eventually figured out that the problem was (almost?) exclusively associated with Google's web crawler bots. As soon as I started ignoring requests with "googlebot" in the user-agent field, the collisions disappeared. I'm guessing that they must cache the results of JS scripts in some semi-intelligent way, with the end result that their spidering browser can't be counted on to behave the way that normal browsers do.
Just an FYI.