生成唯一的N值密钥

时间:2010-03-26 22:50:26

标签: random key

我想生成唯一的随机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 个答案:

答案 0 :(得分:3)

我会调查GUID。从维基百科条目中,“GUID的主要目的是拥有一个完全唯一的数字”,这听起来与您正在寻找的完全一样。有几种实现可以生成GUID,因此您可能不必重新发明轮子。

答案 1 :(得分:1)

请记住,整个密码学领域除其他外依赖于随机数字。因此,国家安全局,中央情报局和世界上一些最优秀的数学家正在努力解决这个问题,所以我保证会有更好的想法。

我吗?我只是做了fbrereto建议的,只是得到了一个指导。或者研究加密密钥生成器,或者你知道,一些熔岩灯和相机。

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

答案 2 :(得分:1)

无论你做什么,如果你最终生成一个使用所有数字和所有字母的密钥,并且如果一个人将要看到该密钥(这可能是你使用数字和字母),省略字符lI1O0人们会让他们感到困惑。

您帖子中的任何内容都没有解决唯一性的问题。你将不得不有两次不生成相同密钥的方法。通常,当我需要一个唯一的密钥时,我会从一开始就有一些独特的信息。我通常采用像单向散列,然后有办法将其转换为具有不同可读性的密钥:

  • 转换为十六进制
  • Base64编码
  • 使用键的位来索引单词列表。

示例:通过在水平线上方散列此答案的一部分计算的唯一字符串是

  绑架的brogue融化的吹嘘者的

答案 3 :(得分:0)

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

答案 4 :(得分:0)

假设您使用的语言/库没有完全可怜的随机数生成器,那么您所拥有的内容看起来相当不错。在一个合理的字母表上均匀分布的N个符号对我来说很有用,并且没有任何适用的代码可能会使它更随机(只是更慢)。

(对于记录,可悲的是,当从给定范围中选择一个值时,可能会抛弃基础随机数的高位。虽然理想情况下所有RNG都会使每个位同等随机,但实际上并非如此;更高-order位往往更随机。这意味着当夹紧到限制范围时,模数运算符完全是错误的。)