我需要使用 SQL Server 生成看似随机的唯一 8 位数字 ID(可以在前面填充零)。是否有内置功能?我看到了 this Identity 属性,但它是连续的,而不是随机的。如果这是不可能的,直接将随机生成的 ID 写入 db 然后检查异常是否是一种好习惯? (请注意,我的应用程序是多线程的,因此除非在原子操作中完成,否则在写入之前检查并不能保证唯一性。)谢谢!更新:添加了“数字”以进行澄清。编辑以表明随机性不需要加密强或任何接近的东西。只是看似随机就足够了。 Oliver 提出了一个优雅的解决方案,我已经使用该方法发布了一个答案。谢谢,奥利弗! 最佳答案 随机性与唯一性发生冲突,但@Oliver 提出了一个优雅的解决方案,当数字只需要出现随机时,而存在潜在顺序。从 Erics 的 http://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/ ,主要思想是对于给定的一对互质,正整数 x 和 m,我们可以找到乘法逆 y 其中 (x*y) % m == 1。这非常有用,因为给定一个数据库行 ID z,我们可以通过执行 encoded = (z*x) % m 将 z 映射到另一个整数。现在有了这个 encoded ,我们怎样才能得到 z 呢?简单,z = (encoded * y) % m 因为 (x*y*z) % m == z 给定 z 请注意,Eric 展示了如何计算这个乘法逆。但如果你很懒,还有 this 。在我的实现中,我只是按原样存储每一行的顺序 ID。然后,每个 ID 都映射到另一个数字,类似于文章中的“InvoiceNumber”。当客户将这个“InvoiceNumber”交还给您时,您可以使用乘法逆将其映射回其原始数据库 ID。下面是一个从 0 到 9 的编码和解码序列的 C# 示例。public static void SeeminglyRandomSequence(){ //use long to prevent overflow long m = 10; //modulo, choose m to be much larger than number of rows long x = 7; //anything coprime to m long y = 3; //multiplicative inverse of x, where (y*x) % m == 1 List<long> encodedSequence = new List<long>(); List<long> decodedSequence = new List<long>(); for (long i = 0; i < m; i++) { long encoded = (i * x) % m; encodedSequence.Add(encoded); } foreach (long encoded in encodedSequence) { long decoded = (encoded * y) % m; decodedSequence.Add(decoded); } Debug.WriteLine("just encoded sequence from 0 to {0}. Result shown below:", (m - 1)); Debug.WriteLine("encoded sequence: " + string.Join(" ", encodedSequence)); Debug.WriteLine("decoded sequence: " + string.Join(" ", decodedSequence));}打印结果为:just encoded sequence from 0 to 9. Result shown below:encoded sequence: 0 7 4 1 8 5 2 9 6 3decoded sequence: 0 1 2 3 4 5 6 7 8 9如您所见,每个输入都映射到一个唯一的输出,并且很容易反转此映射。在您的应用程序中,您可能希望从 1 开始,因为 0 总是映射到自身。只是为了显示较大 m 的“表观随机性”,以下是 m=100,000,000 时的前 10 个映射:just encoded sequence from 1 to 10. Result shown below:encoded sequence: 81654327 63308654 44962981 26617308 8271635 89925962 71580289 53234616 34888943 16543270decoded sequence: 1 2 3 4 5 6 7 8 9 10关于c# - 在 SQL Server 中生成看似随机的唯一数字 ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26967215/ 10-13 06:25