0

在编写我的应用程序时,我想为我的数据库中的某些实体提供随机标签,例如 ABCD。这些总是四个字符,可以包含大写字母和数字。

问题是,如何分配它们?我们永远不会使用它提供的 160 万种可能性,但是随着数据库变得越来越满,使用这个 L4 伪代码生成随机字符串的“查找”时间会呈指数增长:

function makeUniqueKey() {
    while (true) {
        $key = strtoupper(str_random(4));
        if (!DB::table('items')->where('key', '=', $key)->count()) {
            return $key;
        }
    }
}

我想这更像是一个强迫症的好奇心问题,但是为了为数据库中的项目创建随机的、唯一的键,非指数算法有什么巧妙的技巧吗?

4

1 回答 1

1

最好不要随机分配它们。最简单的是增量式(例如:从 aaaa 开始,一直到 ZZZZ)。

无论如何,我都会将此字符串映射到一个数字。aaaa = 1, ZZZZ = 52^4.

然后,您可以选择一个随机数,然后在数据库中搜索第一个间隙。应该可以使用存储过程。随着数据集的增加,这应该使性能至少线性下降,而不是指数下降。

于 2013-08-31T22:56:11.990 回答