c# – 在SQL Server中生成看似随机的唯一数字ID

我需要使用sql Server生成看似随机的唯一8位数字ID(可以在前面填充零).这是否有内置功能?我看到了 this Identity属性,但它是顺序的,而不是随机的.

如果这是不可能的,那么直接将随机生成的ID写入db然后检查异常是一种好习惯吗? (请注意,我的应用程序是多线程的,因此在写入之前进行检查并不能保证唯一性,除非在原子操作中完成.)

谢谢!

更新:添加“数字”以澄清.
编辑表明随机性不需要加密强或任何接近.看似随机就好了.奥利弗提出了一个优雅的解决方案,我已经使用这种方法发布了答案.谢谢,奥利弗!

解决方法

随机性与唯一性发生冲突,但@Oliver提出了一个优雅的解决方案,当数字只需要随机出现时,同时存在基础订单.从Erics的 http://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/开始,主要思想是,给定一对互质,正整数x和m,我们可以找到乘法逆y,其中(x * y)%m == 1.这非常有用,因为给定了一个数据库行ID z,我们可以通过编码=(z * x)%m将z映射到另一个整数.现在给出这个编码,我们怎样才能得到z?简单,z =(编码* 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 3
decoded 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 16543270
decoded sequence: 1 2 3 4 5 6 7 8 9 10

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...