在编写我的应用程序时,我想为我的数据库中的某些实体提供随机标签,例如ABCD。这些字符总是四个字符,可以包含大写字母和数字。
问题是,如何分配它们?我们永远不会使用它提供的160万种可能性,但随着数据库变得越来越充分,使用这个L4伪代码生成随机字符串的“搜索”时间会呈指数级增长:
function makeUniqueKey() {
while (true) {
$key = strtoupper(str_random(4));
if (!DB::table('items')->where('key', '=', $key)->count()) {
return $key;
}
}
}
我认为这更像是一个OCD好奇心问题,但是为了为数据库中的项创建随机的唯一键,是否有非指数算法的巧妙技巧?
答案 0 :(得分:1)
最好不要随意分配它们。最简单的是增量式(例如:从aaaa开始,一直到ZZZZ)。
无论我将此字符串映射到数字。 aaaa = 1
,ZZZZ = 52^4
。
然后,您可以选择一个随机数,然后在数据库中搜索第一个间隙。应该可以使用存储过程。这应该使性能至少线性下降,而不是随着数据集的增加而呈指数下降。