在 JavaScript 中创建 GUID / UUID?

源码码头网 毕业设计 1

我正在尝试在 JavaScript 中创建全局唯一标识符。我不确定所有浏览器上都有哪些例程,内置随机数生成器的“随机性”和播种程度等。

GUID / UUID 应至少为 32 个字符,并且应保持在 ASCII 范围内,以避免在传递它们时出现问题。

回复

共2条回复 我来回复
  • 源码港湾
    这个人很懒,什么都没有留下~
    评论
    generateGUID = (typeof(window.crypto) != 'undefined' && 
                    typeof(window.crypto.getRandomValues) != 'undefined') ?
        function() {
            // If we have a cryptographically secure PRNG, use that
            // https://stackoverflow.com/questions/6906916/collisions-when-generating-uuids-in-javascript
            var buf = new Uint16Array(8);
            window.crypto.getRandomValues(buf);
            var S4 = function(num) {
                var ret = num.toString(16);
                while(ret.length < 4){
                    ret = "0"+ret;
                }
                return ret;
            };
            return (S4(buf[0])+S4(buf[1])+"-"+S4(buf[2])+"-"+S4(buf[3])+"-"+S4(buf[4])+"-"+S4(buf[5])+S4(buf[6])+S4(buf[7]));
        }
    
        :
    
        function() {
            // Otherwise, just use Math.random
            // https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
            return '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);
            });
        }
    
    0条评论
  • 代码海岸
    这个人很懒,什么都没有留下~
    评论

    对于那些想要一个符合 rfc4122 版本 4 并考虑速度的解决方案的人(很少调用 Math.random()):

    function UUID() {
        var nbr, randStr = "";
        do {
            randStr += (nbr = Math.random()).toString(16).substr(2);
        } while (randStr.length < 30);
        return [
            randStr.substr(0, 8), "-",
            randStr.substr(8, 4), "-4",
            randStr.substr(12, 3), "-",
            ((nbr*4|0)+8).toString(16), // [89ab]
            randStr.substr(15, 3), "-",
            randStr.substr(18, 12)
            ].join("");
    }
    

    上述函数应该在速度和随机性之间取得不错的平衡。

    0条评论

发表回复

登录后才能评论