這個問題的一個常見解決方案是可逆的,它是爲數據庫選擇一個隨機加密密鑰,然後對每個輸入字符串進行加密。爲了使目標字符串的大小適當,首先使用不能包含字符串的字符(如空格)填充輸入字符串。
請注意,這個過程是不安全的,但它是僞隨機(或至少,它看起來是隨機的),它避免了任何碰撞的機會。
不幸的是,我不知道紅寶石什麼,但我一起扔在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')
使數字更短,需要找到一個使用較小的塊或使用流密碼來分組密碼。我不知道Ruby在加密庫方面有什麼提供。 (的確,在我編輯這個答案之前,我幾乎不知道Python的加密支持。)
只需生成一個隨機數並在其數據庫的字段中放置一個唯一索引。 –
對不起@SergioTulentsev,我不明白。你能解釋一下如何解決我的問題嗎? –
唯一索引解決了重複問題,您將無法插入兩次相同的值。而rand()會照顧隨機性。 –