2009-08-24 7 views
14

Ho bisogno di generare ID univoci nel browser. Attualmente, sto usando questo:Il modo migliore per generare ID univoci lato client (con Javascript)

Math.floor(Math.random() * 10000000000000001) 

Mi piacerebbe usare l'ora corrente UNIX ((new Date).getTime()), ma sono preoccupati che se due client generano ids al esatto stesso tempo, essi wouldn essere unico

Posso utilizzare l'ora corrente di UNIX (mi piacerebbe perché in questo modo gli ID memorizzerebbero più informazioni)? Se no, qual è il modo migliore per farlo

risposta

16

è possibile creare un GUID utilizzando i seguenti collegamenti (forse il tempo UNIX + 2 cifre casuali?):

http://softwareas.com/guid0-a-javascript-guid-generator

Create GUID/UUID in JavaScript?

Questa volontà massimizza le tue possibilità di "unicità".

In alternativa, se si tratta di una pagina protetta, è possibile concatenare data/ora con il nome utente per impedire più valori generati simultaneamente.

+2

vorrei andare con l'ultimo suggerimento, concatenare con data/ora con nome utente. – kayteen

+1

+1 per "concatenare data/ora con il nome utente per impedire più valori generati simultaneamente.". – Imagist

8

https://github.com/broofa/node-uuid fornisce UUID conformi a RFC basati su timestamp o su # casuali. Un singolo file senza dipendenze, supporta timestamp o UUID casuali basati su #, utilizza API native per numeri casuali di cripto-qualità, se disponibili, oltre ad altri extra.

1
var c = 1; 
function cuniq() { 
    var d = new Date(), 
     m = d.getMilliseconds() + "", 
     u = ++d + m + (++c === 10000 ? (c = 1) : c); 

    return u; 
} 
+1

bel pezzo di codice ma c non è definito – lolol

+0

scuse @lolol –

+0

perché è 'c' al di fuori della dichiarazione delle variabili in' cuniq() '? Inoltre, potresti spiegare la logica dietro questo algoritmo? – vsync

1

Ecco il mio codice javascript per generare guid. Lo fa la mappatura rapida esadecimale e molto efficiente:

AuthenticationContext.prototype._guid = function() { 
    // RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or 
    // pseudo-random numbers. 
    // The algorithm is as follows: 
    //  Set the two most significant bits (bits 6 and 7) of the 
    //  clock_seq_hi_and_reserved to zero and one, respectively. 
    //  Set the four most significant bits (bits 12 through 15) of the 
    //  time_hi_and_version field to the 4-bit version number from 
    //  Section 4.1.3. Version4 
    //  Set all the other bits to randomly (or pseudo-randomly) chosen 
    //  values. 
    // UUID     = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node 
    // time-low    = 4hexOctet 
    // time-mid    = 2hexOctet 
    // time-high-and-version = 2hexOctet 
    // clock-seq-and-reserved = hexOctet: 
    // clock-seq-low   = hexOctet 
    // node     = 6hexOctet 
    // Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx 
    // y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10 
    // y values are 8, 9, A, B 
    var guidHolder = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; 
    var hex = 'abcdef'; 
    var r = 0; 
    var guidResponse = ""; 
    for (var i = 0; i < 36; i++) { 
     if (guidHolder[i] !== '-' && guidHolder[i] !== '4') { 
      // each x and y needs to be random 
      r = Math.random() * 16 | 0; 
     } 

     if (guidHolder[i] === 'x') { 
      guidResponse += hex[r]; 
     } else if (guidHolder[i] === 'y') { 
      // clock-seq-and-reserved first hex is filtered and remaining hex values are random 
      r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0?? 
      r |= 0x8; // set pos 3 to 1 as 1??? 
      guidResponse += hex[r]; 
     } else { 
      guidResponse += guidHolder[i]; 
     } 
    } 

    return guidResponse; 
}; 
2

Nel browser moderno è possibile utilizzare crypto:

var array = new Uint32Array(1); 
window.crypto.getRandomValues(array); 
console.log(array); 
+0

Grande, poiché utilizza entropia di sistema che è molto più alta di quella che si può ottenere all'interno di un browser. –

Problemi correlati