首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从int生成伪随机查找数

从int生成伪随机查找数
EN

Stack Overflow用户
提问于 2012-10-09 23:53:06
回答 2查看 157关注 0票数 1

我有一个输入字符串,格式如下:

代码语言:javascript
复制
<single char><int starting at 1, going up>

并且想要为每一个人生产:

代码语言:javascript
复制
<the same single char><a unique 8 digit number>

即:

代码语言:javascript
复制
"s1" => "s78138782"
"t1" => "t18743682"
"t2" => "t49274876"

不允许-我们已经使用了那个8位数字:

代码语言:javascript
复制
"t1" => "t78138782"

这不需要是可逆的,也就是说,我不需要能够通过算法将"s78138782“转换回s1。我把它们都保存在数据库里,这样我就可以查到了。我只想让这些数字在我逐步遍历t1t2t3等时看起来是随机的,并且不会重复。

显然,8个字符的数字将限制我可以拥有的唯一起始字符串的数量:在这个阶段,我可以接受这一点。

谁能给我一个解决这个问题的算法?我用Ruby做这件事,所以Ruby是最理想的,理想的情况是使用标准的Ruby/Rails gem。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-10 00:20:11

这个问题的一个常见解决方案是为数据库选择一个随机的加密密钥,然后对每个输入字符串进行加密。为了使目标字符串具有合适的大小,您首先需要在输入字符串中填充一些不能作为字符串一部分的字符,例如空格。

请注意,此过程不安全,但它是伪随机的(或者至少看起来是随机的),并且它避免了任何冲突的可能性。

不幸的是,我对Ruby一无所知,但我用Python编写了这个示例:

代码语言:javascript
复制
import Crypto.Cipher.Blowfish
import re
import struct

parse_id = re.compile("^(\D+)(\d+)$")
cipher = Crypto.Cipher.Blowfish.new("badsecret",
                                     Crypto.Cipher.Blowfish.MODE_ECB)

def randomize(id):
  pfx, integer = parse_id.match(id).groups()
  return "%c%d" % (
    pfx,
    struct.unpack("!Q",
                  cipher.encrypt(pfx
                  + struct.pack("!Q",
                                int(integer))[len(pfx):]))[0])

然后我测试了一下:

代码语言:javascript
复制
>>> for i in range(8): print ("t" + str(i), randomize("t" + str(i)))
... 
('t0', 't8812720357104479300')
('t1', 't14570648240240394176')
('t2', 't13775280166960833565')
('t3', 't6391672674195357485')
('t4', 't3595757360042384213')
('t5', 't10728238663553328366')
('t6', 't888684936954575988')
('t7', 't9447169127882289438')
>>> for i in range(8): print ("s" + str(i), randomize("s" + str(i)))
... 
('s0', 's9209414168426526439')
('s1', 's5452467189798635654')
('s2', 's10995755223696930463')
('s3', 's1237785964853872245')
('s4', 's4976813073866522017')
('s5', 's17045636624557288261')
('s6', 's14217087933089289315')
('s7', 's3504968071130220057')

要使数字更短,需要找到具有较小块的块密码或使用流密码。我不知道Ruby在密码库方面提供了什么。(实际上,在我编辑这个答案之前,我对Python的加密支持几乎一无所知。)

票数 1
EN

Stack Overflow用户

发布于 2012-10-10 03:00:52

如果您只是在寻找伪随机,那么numberI将使用rand()函数生成一个随机数,并以这种方式将索引添加到随机数中,这样您就不必担心冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12803856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档