此问题包含两个非常不同的子问题:
- 该字符串看似必须是随机的
- 字符串必须唯一
尽管很容易实现随机性,但没有重试循环的唯一性却不容易。这使我们首先专注于独特性。使用可以轻松实现非随机唯一性
AUTO_INCREMENT。因此,使用保留唯一性的伪随机转换就可以了:
- 哈希由@paul建议
- AES加密也适合
- 但是有一个不错的:
RAND(N)
本身!
保证由同一种子创建的随机数序列是
- 可复制的
- 前8次迭代不同
- 如果种子是
INT32
因此,我们使用@AndreyVolk或@GordonLinoff的方法,但使用以下 种子
RAND:
例如,Assumin
id是一
AUTO_INCREMENT列:
INSERT INTO vehicles VALUES (blah); -- leaving out the number plateSELECT @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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)