【问题标题】:High density random strings in JavascriptJavascript中的高密度随机字符串
【发布时间】:2011-10-21 05:59:18
【问题描述】:

我目前正在使用这个函数 (Create GUID / UUID in JavaScript?) 在 Javascript 中生成 UUID:

lucid.uuid = function() {
    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);
    });
}

我了解所有随机性仅来自 Javascript 的 Math.random() 函数,我不在乎它是否符合 UUID 的 RFC。我想要的是在 Javascript 字符串中将尽可能多的随机性打包到尽可能少的字节中。上面的函数给出了大约 128 位的随机性。我可以将 128 位放入 Javascript 中的字符串有多小(以 HTTP POST 中通过线路发送的 UTF8 字节测量)?我将如何生成这样的字符串?

编辑:此字符串在发送到服务器时将成为 JSON 对象的一部分,因此字符串中需要转义的字符不是很有帮助。

【问题讨论】:

    标签: javascript random uuid


    【解决方案1】:

    这是我想出的一个潜在功能。种子字符串是一组未保留的 URL 字符(其中 66 个)。我在随机性前面加上大约一年的 1 秒分辨率时间戳数据,这很有帮助,因为我的特定应用程序的碰撞空间只会随着时间的推移而相当缓慢地被填满(在 MOST 中每秒生成的最多只有几百个)一个极端的例子)。

    uuidDense = function() {
        var seed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~';
    
        //Start the UUID with 4 digits of seed from the current date/time in seconds
        //(which is almost a year worth of second data).
        var seconds = Math.floor((new Date().getTime())/1000);
    
        var ret = seed[seconds % seed.length];
        ret += seed[Math.floor(seconds/=seed.length) % seed.length];
        ret += seed[Math.floor(seconds/=seed.length) % seed.length];
        ret += seed[Math.floor(seconds/=seed.length) % seed.length];
    
        for(var i = 0; i < 8; i++)
            ret += seed[Math.random()*seed.length|0];
    
        return ret;
    }
    

    想法?

    【讨论】:

      【解决方案2】:

      128 位 = 16 字节 -> base64 -> 16*3/2 = 将为您提供 24 个字符的字符串(相对于您拥有的 36 个字符)

      您也可以使用 base85 来获得更好的密度,但这需要 URL 编码,因此您可能会得到比以前更糟糕的结果。

      【讨论】:

        【解决方案3】:

        你的问题有些自相矛盾。 Javascript 字符串使用 UCS-2(固定 16 位字符)作为其内部表示。然而 UTF-8 是可变宽度的,但出于编码目的,我相信最紧凑的形式是使用 1 字节的 UTF8 字符,它只要求最高有效位为零。 IE。你可以将 128 位打包成 128 * 8/7 = 147 位。

        转换为字节并向上取整,您可以在 19 个字符内完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-13
          • 1970-01-01
          • 2012-05-30
          • 2018-01-25
          • 1970-01-01
          • 2010-11-23
          • 2012-03-31
          • 2020-11-29
          相关资源
          最近更新 更多