Sql server 生成随机的10位数字作为ID的一部分,并确保没有重复

Sql server 生成随机的10位数字作为ID的一部分,并确保没有重复,sql-server,random,Sql Server,Random,我有一个请求,作为我正在处理的应用程序的一部分,用于生成符合以下条件的用户ID: 它将有一组4位前缀 接下来的10位数字将是随机的 将在末尾添加一个校验位 第1点和第3点是直截了当的,但最好的方法是生成一个10位数的随机数,同时确保它尚未被使用 我并不特别喜欢随机选择一个,看看它是否被拿走,然后要么接受,要么再试一次 我的另一个想法是提前生成一个由X个数字组成的列表,X是一个大于您希望创建的帐户数量的数字,并且在创建帐户时从列表中删除下一个数字 有什么想法吗 编辑: 让我们将技术引入其中。如果我

我有一个请求,作为我正在处理的应用程序的一部分,用于生成符合以下条件的用户ID:

它将有一组4位前缀 接下来的10位数字将是随机的 将在末尾添加一个校验位 第1点和第3点是直截了当的,但最好的方法是生成一个10位数的随机数,同时确保它尚未被使用

我并不特别喜欢随机选择一个,看看它是否被拿走,然后要么接受,要么再试一次

我的另一个想法是提前生成一个由X个数字组成的列表,X是一个大于您希望创建的帐户数量的数字,并且在创建帐户时从列表中删除下一个数字

有什么想法吗

编辑:
让我们将技术引入其中。如果我使用的是SQL server数据库,有没有办法让数据库为我做到这一点?例如,强制执行唯一约束并让数据库生成数字?

要100%确保没有其他具有相同随机数字的用户名,唯一的方法是将生成的用户名与所有现有用户进行比较,您必须在某个时候进行比较

唯一的可能是在代码端执行此操作

但是您可以将随机生成的id保存到userdatabase,并将其与代码中的新密钥进行比较

e、 g.从xy中选择*其中userid='newuserid'

如果结果为空,则不会生成密钥。

加密。看

您需要的基本上是加密顺序ID,从而生成一个看似随机的数字


特别好的是,您可以在所有客户端完成此操作,尽管是在两个连续的事务中。

多亏了Anton的回答,我找到了skip32加密算法的C实现

使用它,我可以传入一个递增的数据库标识整数,并从中获得一个看起来很好的随机9/10位数。一个简单的电话,比如

int result = cipher.Encrypt(databaseIdentity);

我会给我想要的号码。无需重复检查,因为每个用户都是唯一的。

要100%确保没有其他用户ID具有相同的随机数字,唯一的方法是将生成的用户ID与所有现有用户进行比较。。。。你可以按照OP的建议先发制人,也可以按照OP不喜欢的方式创作,但总有一天你必须这么做。让我们把技术引入其中。强制一个唯一的约束很容易,只需在列上添加一个唯一的索引;因此,您不需要选择,只要插入并在插入失败时生成另一个。让数据库生成它是不可能的,除非您创建了一个可以执行相同操作的存储过程,或者您使用uniqueidentifier创建的GUID不是10位数字,而是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx。如果您将随机更改为看似随机,这是一个好主意;任何足够不透明的双射方法都应该这样做。找到一个精确生成10位数的双射是一个挑战;OP应该判断他的2要求有多严格。@Amadan您总是可以用零填充,得到精确的10位数字。您是对的,在32位输出的情况下,您将始终拥有最多10位数字。这也很有趣: