定长随机字符串的生成,运行如下 select 语句即可生成一个定长的随机字符串:

select substring(md5(rand()), 1, 20);

通过上述语句,我们可以得到一个20个字符的随机字符串,如果你想使用其他长度,调整参数值即可(但注意最长32位)。

生成定长随机字符串的原理分析:

我们一步一步剖析上述生成定长字符串的select语句,来看看这个语句的原理是啥,我们逐个函数来看:

1. rand() : 这个函数其实就是生成一个 0-1 的随机数字(图1示)。

2. md5(param) : 这个函数就是使用md5算法返回参数 param 的摘要值,对于任何参数,这个摘要都是一个128位的定长二进制串,即32位定长的十六进制串,这也是这个语句最多生成32位串的原因。(图2示)。

3. substring(param, startIndex, endIndex) : 对参数串 param 进行截取,根据自己的需求,从32位串中截取所需长度。

生成定长随机字符串方法的弊端分析:

上述方法优点就是写法简单,但弊端也很明显:

1. 最长32位字符串,当我们的需求超过32位,则需要使用concat函数对多个随即串进行拼接(图1示)。

2. md5(param) 函数对同一个 param 参数会返回相同的值,我们使用 rand() 函数返回的随机数作为参数,如果 rand() 返回的值相同则 md5() 返回的值也会一致,如果我们使用这个值作为主键的话,则会产生冲突;当然 md5() 函数本身返回 128 位二级制串(定长),不同的参数也会返回相同的值(鸽巢原理),但这个概率极低,可以忽略。

3. 这个方法返回的串使用的字符集合是 0-9 a b c d e f (16种字符),字符种类十分有限。

生成随机串的另一种方法简介:

除了上述方法外,我们还可以使用 uuid() 函数完成随机字符串的生成:

select replace(uuid(), '-', '');

因为 uuid() 函数返回的串中会包含特殊字符 "-" , 所以我们需要通过 replace 函数将这个特殊字符全部替换掉。这个方式也会返回一个 32 位的定长串,你可以根据需求通过 substring 或者 concat 两个函数截取拼接你所需长度的字符串。

我们可以通过如下方法随机生成一个 0 -100 的数值:

select round(rand() * 100);

通过乘以的数值(上面使用的是100),你可以调节所需随机数的范围。