如果这是不可能的,那么直接将随机生成的ID写入db然后检查异常是一种好习惯吗? (请注意,我的应用程序是多线程的,因此在写入之前进行检查并不能保证唯一性,除非在原子 *** 作中完成.)
谢谢!
更新:添加“数字”以澄清.
编辑表明随机性不需要加密强或任何接近.看似随机就好了.奥利弗提出了一个优雅的解决方案,我已经使用这种方法发布了答案.谢谢,奥利弗!
在我的实现中,我只是按原样存储每行的顺序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全部内容,希望文章能够帮你解决c# – 在SQL Server中生成看似随机的唯一数字ID所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)