Thursday, April 24, 2014

Javascript GUIDs

It seems a lot of bright people have come up with Javascript implementations of GUIDs. The problem with them all seems to be the way Javascript handles both time and randomness. Also different browsers have their hang ups. Anyway, here is a solution that though not perfect has a good chance of generating SQL compliant GUIDs in Javascript with a very low (but not impossible) chance of collisions. Comments welcome.

 function generateUUID(){  
   var d = new Date().getTime();  
   var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {  
     var r = (d + Math.random()*16)%16 | 0;  
     d = Math.floor(d/16);  
     return (c=='x' ? r : (r&0x7|0x8)).toString(16);  
   });  
   return uuid;  
 };  

The above var d = new Date().getTime() can be improved by some modern Javascript features, but I'm not sure how supported they are. Here are some additional links with good information about Javascript GUIDs and problems with cryptography, randomness, and collisions.

http://slavik.meltser.info/the-efficient-way-to-create-guid-uuid-in-javascript-with-explanation/
http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript
http://stackoverflow.com/questions/6906916/collisions-when-generating-uuids-in-javascript
http://af-design.com/blog/2008/09/05/updated-javascript-uuid-generator-v03/