代码之家  ›  专栏  ›  技术社区  ›  MiKo

生成唯一的N值密钥

  •  2
  • MiKo  · 技术社区  · 14 年前

    我想生成唯一的随机N值密钥。 此键可以包含数字和拉丁字符,即A-Za-z0-9。

    我考虑的唯一解决方案是这样的(伪代码):

    key = "";
    smb = "ABC…abc…0123456789"; // allowed symbols
    for (i = 0; i < N; i++) {
        key += smb[rnd(0, smb.length() - 1)]; // select symbol at random position
    }
    

    有没有更好的解决办法?你有什么建议?

    5 回复  |  直到 14 年前
        1
  •  3
  •   fbrereto    14 年前

    我会调查 GUID S从Wikipedia条目来看,“GUID的主要目的是拥有一个完全唯一的数字”,这听起来和您要查找的完全一样。有几种实现可以生成guid,因此您可能不必重新发明轮子。

        2
  •  1
  •   Spike    14 年前

    记住,密码学的整个领域都依赖于随机数的产生。因此,国家安全局,中情局,和一些世界上最好的数学家正在研究这个问题,所以我向你们保证,有更好的想法。

    哦,至于你的密码;根据语言的不同,您可能需要为RNG设置种子,否则它每次都会生成相同的密钥。

        3
  •  1
  •   Norman Ramsey    14 年前

    无论您做什么,如果您最终生成了一个使用所有数字和字母的密钥,并且如果有人会看到该密钥(如果您使用的是数字和字母,则很可能会看到该密钥), l , I , 1 O ,和 0 . 人们把他们搞糊涂了。

    独特性 . 你必须有办法不产生相同的密钥两次。通常,当我需要一个唯一的密钥时,我会从一些唯一的信息开始。我通常带一个 与MD5一样,还有一些方法可以将其转换为具有不同可读性的键:

    • 转换为十六进制
    • 使用关键字的位索引到单词列表中。

    示例:通过将此答案中位于水平线上方的部分散列计算出的唯一字符串为

        4
  •  0
  •   Jason Kleban    14 年前

    您可以对一些随机数据进行base64编码并从结果中删除+、/、和=字符吗?我不知道这是否会成为一个可预测的分布。而且,你现在做的似乎比你现在做的更多,这是一个很好的解决方案。

        5
  •  0
  •   Donal Fellows    14 年前

    (作为记录,pathetic将包括在从给定范围中选择值时丢弃底层随机数的高阶位。虽然理想情况下,所有RNG都会使每一位都具有相同的随机性,但实际上并非如此;高阶位往往更随机。这意味着当夹紧到限制范围时,使用模数运算符是完全错误的。)