2009-08-24 14 views
14

Potrzebuję wygenerować unikatowe identyfikatory w przeglądarce. Obecnie używam to:Najlepszy sposób na generowanie unikalnych identyfikatorów ids po stronie klienta (z Javascript)

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

Chciałbym wykorzystać obecny czas uniksowy ((new Date).getTime()), ale obawiam się, że jeśli klienci generują dwa identyfikatory na dokładny samym czasie, byłoby miło jest wyjątkowy.

Czy mogę użyć aktualnego czasu UNIX (chciałbym, ponieważ w ten sposób numery identyfikacyjne będą przechowywać więcej informacji)? Jeśli nie, co jest najlepszym sposobem, aby to zrobić

Odpowiedz

16

można utworzyć identyfikator GUID za pomocą poniższych linków (może czas uniksowy + 2 losowe cyfry):

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

Create GUID/UUID in JavaScript?

Będzie zmaksymalizuj swoją szansę na "wyjątkowość".

Alternatywnie, jeśli jest to strona zabezpieczona, można połączyć datę i godzinę z nazwą użytkownika, aby zapobiec wielu jednoczesnym wygenerowanym wartościom.

+2

pójdę z ostatniej sugestii, złączyć z DATE/TIME z nazwą użytkownika. – kayteen

+1

+1 dla "połączenia daty/czasu z nazwą użytkownika, aby zapobiec wielu jednoczesnym wygenerowanym wartościom.". – Imagist

8

https://github.com/broofa/node-uuid udostępnia identyfikatory UUID zgodne z RFC na podstawie znacznika czasu lub losowego #. Pojedynczy plik bez zależności, obsługuje sygnatury czasowe lub losowe identyfikatory UUID, wykorzystuje natywne interfejsy API dla liczb losowych krypto-jakości, jeśli są dostępne, oraz inne.

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

    return u; 
} 
+1

ładny kawałek kodu, ale c jest niezdefiniowany – lolol

+0

przeprosiny @lolol –

+0

dlaczego jest "c" poza deklaracją zmiennych w 'cuniq()'? Czy mógłbyś wyjaśnić logikę tego algorytmu? – vsync

1

Oto mój kod javascript do generowania GUID. Czyni szybkiego mapowania hex i bardzo wydajny:

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

w nowoczesnej przeglądarce można użyć crypto:

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

Świetne, ponieważ wykorzystuje to entropię systemową, która jest o wiele wyższa niż można dostać się do przeglądarki. –

Powiązane problemy