3915 votos

Cómo crear un GUID / UUID en Javascript?

Estoy tratando de crear a nivel mundial-identificadores únicos en Javascript. No estoy seguro de qué rutinas están disponibles en todos los navegadores, cómo "al azar" y sembraron la incorporada en el generador de números aleatorios es, etc..

El GUID / UUID debe ser al menos de 32 caracteres y debe permanecer en el rango ASCII para evitar problemas cuando se les pasa de todo.

3795voto

broofa Puntos 21663

Para un rfc4122 versión 4 compatible con la solución, este one-liner(ish) la solución es la más compacta que podría subir con.:

'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);
});

Por ejemplo:

>>> '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);});
"3bce4931-6c75-41ab-afe0-2ec108a30860"

2225voto

John Millikin Puntos 86775

Ha habido un par de intentos en este. La pregunta es: ¿quieres Guid reales, o sólo números aleatorios que mirar como Guid? Es bastante fácil para generar números aleatorios. De http://note19.com/2007/05/27/javascript-guid-generator/ (después de algún de limpieza en aras de la claridad):

var guid = (function() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
               .toString(16)
               .substring(1);
  }
  return function() {
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
           s4() + '-' + s4() + s4() + s4();
  };
})();

Sin embargo, una nota en los comentarios que tales valores no son genuinos Guid. No hay manera de generar verdaderas Guid en Javascript, ya que dependen de las propiedades del equipo local que los navegadores no exponga. Deberás utilizar OS específicos como los servicios de ActiveX: http://p2p.wrox.com/topicindex/20339.htm Edit: no es correcto - RFC4122 permite al azar ("versión 4") id. Ver otras respuestas para los detalles.

Uso:

var uuid = guid();

780voto

Briguy37 Puntos 4748

Me gusta mucho cómo limpiar Broofa la respuesta es, pero es una lástima que los pobres de las implementaciones de Math.random salir de la probabilidad de colisión.

He aquí una similar RFC4122 versión 4 compatible con la solución que resuelve el problema mediante la compensación de los primeros 13 números hexadecimales por un hex parte de la marca de hora. De esa manera, incluso si Math.random está en la misma semilla, tanto de los clientes que tienen para generar el UUID en el mismo milisegundo (o 10.000+ años más tarde) para obtener el mismo UUID:

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;
};


Aquí un violín a prueba.

151voto

Kevin Hakanson Puntos 15498

Aquí un poco de código basado en RFC 4122, la sección 4.4 (Algoritmos para la Creación de un UUID de Verdaderamente Aleatorio o Pseudo-Aleatorio).

function createUUID() {
    // http://www.ietf.org/rfc/rfc4122.txt
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = "-";

    var uuid = s.join("");
    return uuid;
}

82voto

broofa Puntos 21663

Hay un bonito compacto de la función para la creación de rfc4122 compatible con azar Uuid publicado en mi blog en:

http://www.broofa.com/2008/09/javascript-uuid-function/

Math.uuid.js es pequeño (~400bytes), y no tiene dependencias en otras librerías, por lo que puede colocar en casi cualquier JS proyecto. Puede ser utilizado para producir cualquiera de las RFC4122 compatible con v4 (al azar) uuid, o más compacto, no estándar Identificadores de longitud arbitraria y de la base. Por ejemplo:

>>> Math.uuid() // RFC4122 v4 UUID
"4FAC90E7-8CF1-4180-B47B-09C3A246CB67"

>>> Math.uuid(17) // 17 dígitos, base 62 (0-9,a-Z,A-Z)
"GaohlDbGYvOKd11p2"

>>> Math.uuid(5, 10) // 5 dígitos en base 10
"84274"

>>> Math.uuid(8, 16) // 8 dígitos, base 16
"19D954C3"

P.D. la entrada en el blog también enlaces a una página de prueba que muestra el número de posibles Uuid hay para una gran variedad de argumentos, y que incluye una prueba de rendimiento para aquellos que se preocupan por ese tipo de cosas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X