小编典典
此问题包含两个非常不同的子问题:
该字符串看似必须是随机的
字符串必须唯一
尽管很容易实现随机性,但没有重试循环的唯一性却不容易。这使我们首先专注于独特性。使用可以轻松实现非随机唯一性AUTO_INCREMENT。因此,使用保留唯一性的伪随机转换就可以了:
哈希由@paul建议
AES加密也适合
但是有一个不错的:RAND(N)本身!
保证由同一种子创建的随机数序列是
可复制的
前8次迭代不同
如果种子是 INT32
因此,我们使用@AndreyVolk或@GordonLinoff的方法,但使用以下 种子 RAND:
例如,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;
2020-05-17