UNPKG

phpjs

Version:

php.js offers community built php functions in javascript

345 lines (263 loc) 11 kB
<!-- Generated by Rakefile:build --> <strong> <a href="hazarartuner.com / under construction" rel="nofollow">Mehmet Hazar Artuner</a> </strong> on 2011-12-18 23:10:53 <br /> thank you so much, you saved my life :D :D <hr /> <strong> <a href="http://kevin.vanzonneveld.net" rel="nofollow">Kevin van Zonneveld</a> </strong> on 2009-06-10 14:38:03 <br /> @ Kankrelune: Ok must be a caching issue then. I will try and see if I can reproduce it. <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-06-02 16:18:30 <br /> Yes me to... i don't see the difference today but the code is not the same than yesterday... a cache problem or i don't know... i was not drunked yet... lol... .. . @ tchaOo° <hr /> <strong> <a href="http://kevin.vanzonneveld.net" rel="nofollow">Kevin van Zonneveld</a> </strong> on 2009-06-02 10:52:38 <br /> @ Kankrelune: Great job! Added! (ps: I don't see a difference between the text file you uploaded and the source below, seems ok? am I not seeing it or was it different before?) <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-06-01 16:35:15 <br /> the code is not complete... it's a strange bug i have the same when i post version_compare() http://www.webfaktory.info/uniqid.txt @ tchaOo° <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-06-01 16:32:23 <br /> Final version without collisions... <pre><code> function uniqid( prefix, more_entropy) { // string uniqid( [ str prefix, [ bool more_entropy ]]) // Generates a unique ID // // version: // discuss at: http://phpjs.org/functions/uniqid // + original by: Kankrelune (http://www.webfaktory.info/) // * example 1: uniqid(); // * returns 1: 'a30285b160c14' // * example 2: uniqid('foo'); // * returns 2: 'fooa30285b1cd361' // * example 3: uniqid('bar', true); // * returns 3: 'bara20285b23dfd1.31879087' if(typeof prefix == 'undefined') prefix = &quot;&quot;; var retId; var formatSeed = function(seed, reqWidth) { seed = parseInt(seed,10).toString(16); // to hex str if (reqWidth &lt; seed.length) { // so long we split return seed.slice(seed.length - reqWidth); } if (reqWidth &gt; seed.length) { // so short we pad return Array(1 + (reqWidth - seed.length)).join('0')+seed; } return seed; }; // BEGIN REDUNDANT if (!this.php_js) { this.php_js = {}; } // END REDUNDANT if (!this.php_js.uniqidSeed) { // init seed with big random int this.php_js.uniqidSeed = Math.floor(Math.random() * 0x75bcd15); } this.php_js.uniqidSeed++; retId = prefix; // start with prefix, add current milliseconds hex string retId += formatSeed(parseInt(new Date().getTime()/1000,10),8); retId += formatSeed(this.php_js.uniqidSeed,5); // add seed hex string if(more_entropy) // for more entropy we add a float lower to 10 retId += (Math.random()*10).toFixed(8).toString(); return retId; } </code></pre> tested on 500.000 ids generated with the same prefix... .. . ;o) @ tchaOo° <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-06-01 11:28:24 <br /> Hi... you're revisited version don't work... on start replace <pre><code> prefix += ''; </code></pre> by the original code... <pre><code> if(typeof prefix == 'undefined') prefix = &quot;&quot;; </code></pre> i have made this for a simple cause... an undefined var is casted to a string she's transformed to a string with for contents &quot;undefined&quot; and after the ids is malformed... undefinded4a2027b600c14 I think it's not a good idea to use an uniqid var on the uniqid function... it's a risk to dev confusion and namespace collision (? i speak english same as a spanish cow lol) rename he to id or other is better... same for... <pre><code> return this.uniqid(prefix, more_entropy, reduce_collision);</code></pre> &gt;&gt; <pre><code> return uniqid(prefix, more_entropy, reduce_collision); </code></pre> Bye <hr /> <strong> <a href="http://kevin.vanzonneveld.net" rel="nofollow">Kevin van Zonneveld</a> </strong> on 2009-05-31 21:01:29 <br /> @ Kankrelune: Agreed but I believe the way it's set up now it will only generate a new number every second. If this function is used in a loop, you may get many iterations ( ids ) per second, and so there's nothing really unique about those. If we fix the bug it will be much better, for now I have to leave the current implementation in tact though. <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-05-31 20:44:20 <br /> Hi... i have allredy think to store the ids and re generate if collision but i don't like this idea... and i don't like the 3rd parameter... .. . :o) On the last test i have 20/35 collisions for 10.000 ids generate with the same prefix... for me 0.2% of collision it's more like PHP than a 3rd parameter... .. . ;o) I know where is the problem... i work on when i have time... .. . @ tchaOo° ps: sorry for my english <hr /> <strong> <a href="http://kevin.vanzonneveld.net" rel="nofollow">Kevin van Zonneveld</a> </strong> on 2009-05-31 19:24:20 <br /> @ Kankrelune: Thanks a lot for investing your time! I would really like to have the implementation like PHP, but it still needs some work. Checkout comments here: http://trac.plutonia.nl/projects/phpjs/browser/trunk/functions/misc/uniqid.js <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-05-31 15:07:29 <br /> Updated version without sprintf() dependencie and a lower collisions ratio (30/10.000)... <pre><code> // uniqid( [ str prefix, [ bool more_entropy ]]) // Generate a unique ID // + original by: Kankrelune (http://www.webfaktory.info/) // * example 1: uniqid(); // * returns 1: 4a2027b600c14 // * example 2: uniqid( time()); // * returns 2: 12436214644a20285a07b3f // * example 3: uniqid( time(), true); // * returns 3: 12436214644a20285b1cd361.31879087 function uniqid( prefix, more_entropy) { if(typeof prefix == 'undefined') prefix = &quot;&quot;; var now, sec, usec; var formatBase = function(value, reqWidth) { value = (value &gt;&gt;&gt; 0).toString(16); if (reqWidth &gt; value.length) return Array(1 + (reqWidth - value.length) &gt;&gt;&gt; 0).join('0') + value; if (reqWidth &lt; value.length) return value.slice(0,reqWidth); return value; }; var getRandSeed = function() { return [ 0xa524,0x11f9b,0x11c3a,0x7f5e,0xbe31,0x585a,0xc9c9,0xbee7,0x6a0f,0x8cb2, 0x713e,0x11b99,0x4b7f,0x81f9,0x5e8d,0x15f34,0x57a9,0x10658,0x300d,0xa5da, 0x13150,0xdf23,0x31b5,0x16fbc,0x17260,0xda84,0x15d13,0x17dc4,0x6263,0x11909, 0x147ab,0x99b0,0xacf1,0x10da2,0xeb0f,0x9616,0x3e5b,0xd8dd,0x9331,0x13cb4, 0x6701,0x148e3,0x139a4,0x4e74,0x6e6c,0x1230a,0x73e9,0x4b87,0x49c2,0x1357a, 0x96cb,0x5010,0x9bc6,0x4588,0x9306,0x18107,0x1599f,0x7c97,0x16229,0x441c ][Math.floor( ( Math.random( ) * this.length ) )]; }; var makeSeed = function(seed) { return seed * ((((Math.random() * getRandSeed()) * (Math.random() * getRandSeed())) * getRandSeed()) * getRandSeed()); }; now = new Date().getTime()/1000; sec = parseInt(now,10); usec = Math.round((now-sec)*1000)/1000; if(more_entropy) // for more entropy we add a float lower to 10 return prefix+formatBase(sec,8)+formatBase(makeSeed(usec),5)+(Math.random()*10).toFixed(8); return prefix+formatBase(sec,8)+formatBase(makeSeed(usec),5); } </code></pre> @ tchaOo° <hr /> <strong> <a href="http://www.webfaktory.info/" rel="nofollow">Kankrelune</a> </strong> on 2009-05-29 23:34:31 <br /> I did the conversion. It works correctly, there are some collisions when more_entropy is false, but nothing really bad + / - 50 or 60 per 10,000 id created with the same prefix ... -&gt; http://img33.imageshack.us/img33/1899/testsa.png <pre><code> // uniqid( [ str prefix, [ bool more_entropy ]]) // Generate a unique ID // + original by: Kankrelune (http://www.webfaktory.info/) // - depends on: sprintf // * example 1: uniqid(); // * returns 1: 4a2027b600c14 // * example 2: uniqid( time()); // * returns 2: 12436214644a20285a07b3f // * example 3: uniqid( time(), true); // * returns 3: 12436214644a20285b1cd361.31879087 function uniqid( prefix, more_entropy) { if(typeof prefix == 'undefined') prefix = &quot;&quot;; var now, sec, usec; now = new Date().getTime()/1000; sec = parseInt(now,10); usec = Math.round((now-sec)*1000)/1000; if(more_entropy) // for more entropy we add a float lower to 10 return sprintf(&quot;%s%08x%05x%s&quot;,prefix,sec,(usec*(Math.random()*999999)),(Math.random()*10).toFixed(8)); return sprintf(&quot;%s%08x%05x&quot;,prefix,sec,(usec*(Math.random()*999999))); } </code></pre> @ tchaOo° <hr /> <strong> <a href="http://kevin.vanzonneveld.net" rel="nofollow">Kevin van Zonneveld</a> </strong> on 2009-04-19 23:26:43 <br /> @ Michael Grier: That was exactly what I needed :D great. I will process the C code when I find the time. Thanks a lot, I'll make sure to mention your name in the final version. <hr /> <strong> Brett Zamir </strong> on 2009-04-16 00:14:07 <br /> Aha...Gotcha...Thanks <hr /> <strong> Michael Grier </strong> on 2009-04-15 15:42:46 <br /> That wasn't my point. Kevin just mentioned in the comments of the function that &quot;we need to checkout the PHP source to find out how they generate this exactly,&quot; so since nobody else &quot;seemed&quot; to have done this (there are no other comments here about it), I looked for and posted the source. <hr /> <strong> Brett Zamir </strong> on 2009-04-15 03:18:29 <br /> Hi Michael, While it's great to use heavier algorithms, such as in the PHP source, I think our initial focus is on replicating the PHP API regardless of implementation--if you can make any implementations more robust (and/or speed them up), go for it! :) <hr /> <strong> <a href="http://mgrier.com/te5t/uniqid-source.txt" rel="nofollow">Michael Grier</a> </strong> on 2009-04-14 17:53:59 <br /> Here's the 5.2.9 source for uniqid.c and lcg.c http://mgrier.com/te5t/uniqid-source.txt (you can click my name for same page) Here's the short version of &quot;more_entropy&quot; <pre><code> /* * combinedLCG() returns a pseudo random number in the range of (0, 1). * The function combines two CGs with periods of * 2^31 - 85 and 2^31 - 249. The period of this function * is equal to the product of both primes. */ </code></pre> <hr />