Bra*_*rad 2 sql sql-server random
最好的方法是什么?
我需要生成一个5位长的字符串,其中所有字符都是数字.但是,我需要能够执行此'x'次(用户变量)并将此随机字符串存储在数据库中.此外,我不能两次生成相同的字符串.6个月后将删除旧琴弦.
伪代码
DECLARE @intIterator INT,
@intMax
SET @intIterator = 1
SET @intMax = 5 (number of strings to generate)
WHILE @intIterator <= @intMax
BEGIN
-- GENERATE RANDOM STRING OF 5 NUMERIC DIGITS
???
-- INSERT INTO DB IF DOESN'T ALREADY EXIST
INSERT INTO TSTRINGS
SELECT @RANDOMSTRING
IF @@ERROR = 0
SET @intIterator = @intIterator + 1
END
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是最好的方法,所以建议值得赞赏.但真正寻找有关如何生成数字5长度字符串的想法.
"显而易见"的方式可以描述为" key = random; while (key already selected) { key = random }".它有效,但是生日悖论意味着我们的钥匙碰撞几率以惊人的指数速率增加,与已经使用过的钥匙数成比例.因此,选择随机密钥对于每个新密钥平均指数地变长,并且很可能最终陷入无限或任意长的循环中.
您最好先预先生成密钥列表,如下所示:
保持一个UniqueKeys包含所有预先计算的字符串'00000'...'99999'的表,以及一个keyOrder始终初始化为newId()插入的字段.keyOrder应该编入索引.
当你需要"生成"一个字符串时,你可以在几乎恒定的时间内拉出下一个可用的密钥.现在您有了一个密钥,您可以将其删除以防止它被重用.SELECT TOP 1 key FROM UniqueKeys ORDER BY keyOrderUniqueKeys
每隔六个月,截断并重新生成您的UniqueKeys表格.
这种风格的优点是相对简单的实现,几乎恒定的时间来生成下一个密钥,并避免上面讨论的令人讨厌的"检查是否存在于循环中".