"s78138782" "t1" => "t18743682" "t2" => "t49274876" 不允许 - 我-6ren">
gpt4 book ai didi

ruby - 从 int 生成伪随机数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:54 26 4
gpt4 key购买 nike

我有一个具有这种形式的输入字符串:

<single char><int starting at 1, going up>

并想为每个人生产:

<the same single char><a unique 8 digit number>

即:

"s1" => "s78138782"
"t1" => "t18743682"
"t2" => "t49274876"

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

"t1" => "t78138782"

这不需要是可逆的,即,我不需要能够通过算法将“s78138782”转换回 s1。我将它们都保存在数据库中,以便我可以查找。我只是希望数字在我逐步完成 t1t2t3 等时看起来是随机的,并且不会重复。

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

谁能给我一个算法?我在 Ruby 中执行此操作,因此 Ruby 将是理想的,并且理想情况下使用标准的 Ruby/Rails gem。

最佳答案

此问题的一个常见解决方案(具有可逆性)是为数据库选择一个随机加密 key ,然后加密每个输入字符串。为了使目标字符串大小合适,您首先用一些不能成为字符串一部分的字符(例如空格)填充输入字符串。

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

不幸的是,我对 Ruby 一无所知,但我用 Python 拼凑了这个例子:

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])

然后我测试了一下:

>>> 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')

要使数字更短,需要找到 block 更小的分组密码或使用流密码。我不知道 Ruby 在加密库方面必须提供什么。 (事实上​​ ,在我编辑此答案之前,我对 Python 的加密支持几乎一无所知。)

关于ruby - 从 int 生成伪随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com