这个问题由两个截然不同的子问题组成:
虽然随机性很容易实现,但没有重试循环的唯一性却不容易实现.这让我们首先要关注独特性.非随机唯一性可以用AUTO_INCREMENT
实现.因此,使用保持唯一性的伪随机变换就可以了:
- Hash是由@paul建议的
- AES也适用
- 但有一个很好的例子:
RAND(N)
本身!
由同一种子创建的随机数序列保证
- 可复制
- 在前8次迭代中有所不同
- 如果种子是
INT32
所以我们使用了@AndreyVolk或@GordonLinoff的方法,但使用了seeded RAND
:
e、 g.Assumin id
是一个AUTO_INCREMENT
列:
INSERT INTO vehicles VALUES (blah); -- leaving out the number plate
SELECT @lid:=LAST_INSERT_ID();
UPDATE vehicles SET numberplate=concat(
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)
)
WHERE id=@lid;