如何修复此代码,以便以小写形式生成唯一的随机字母和数字?
api_string = (0...32).map{65.+(rand(25)).chr}.join
Run Code Online (Sandbox Code Playgroud)
目前,它只生成字母.
在我正在开发的Ruby on Rails应用程序中,我允许用户上传文件,并希望为这些文件提供一个简短的随机字母数字名称.(例如'g7jf8'或'3bp76').做这个的最好方式是什么?
我想从原始文件名和时间戳生成哈希/加密字符串.然后查询数据库以仔细检查它不存在.如果是,请生成另一个并重复.
我用这种方法看到的问题是,如果重复字符串有很高的可用性,它可能会增加很多数据库负载.
这篇文章指出
尽管Mersenne Twister是一个非常好的伪随机数生成器,但由于一个非常简单的原因,它本身并不具有加密安全性.可以从发电机在任何给定时间具有的状态确定发电机的所有未来状态,并且624个32位输出或19,937个一位输出足以提供该状态.在Mersenne Twister的输出上使用加密安全散列函数(如SHA-1)已被推荐为获取密码学中有用的密钥流的一种方法.
但是没有提及为什么消化输出会使它更安全.老实说,我不明白为什么会这样.Mersenne Twister的周期为2 ^ 19937-1,但我认为我的推理也适用于任何周期性PRNG,例如线性同余发生器.由于安全单向函数h的特性,人们可以将h视为内射函数(否则我们可以产生碰撞),从而简单地将值从其域映射到其范围中以一对一的方式.
考虑到这一点,我认为散列值将产生与原始Mersenne Twister完全相同的周期性行为.这意味着如果您观察到一个周期的所有值并且值开始重复,那么您完全能够预测所有未来的值.
我认为这与在基于密码的加密(PKCS#5)中应用的原理相关- 因为密码域不能提供足够的熵,只是哈希密码不会增加任何额外的熵 - 这就是你需要的原因在哈希之前加密密码.我认为完全相同的原则适用于此.
一个简单的例子最终说服了我:假设你有一个非常糟糕的PRNG,总是产生1的"随机数".那么即使SHA-1是一个完美的单向函数,将SHA-1应用于输出也是如此总是产生相同的值,从而使输出不比以前更容易预测.
尽管如此,我还是要相信这篇文章有一些道理,所以我肯定忽视了一些事情.你能帮我吗?在很大程度上,我从我的论点中遗漏了种子价值 - 也许这就是魔术发生的地方?