C#生成唯一值的方法汇总
来源:互联网 发布:mac book air能吃鸡吗 编辑:程序博客网 时间:2024/05/27 21:46
生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试:
一、在 .NET 中生成
1、直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛。GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计算机都不会生成重复的 GUID 值(即保证所有机器都是唯一的)。关于GUID的介绍在此不作具体熬述,想深入了解可以自行查阅MSDN。代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace ConsoleApplication1 6 { 7 class Program 8 { 9 static void Main(string[] args)10 {11 string _guid = GetGuid();12 Console.WriteLine("唯一码:{0}\t长度为:{1}\n去掉连接符:{2}", _guid, _guid.Length, _guid.Replace("-", ""));13 string uniqueIdString = GuidTo16String();14 Console.WriteLine("唯一码:{0}\t长度为:{1}", uniqueIdString, uniqueIdString.Length);15 long uniqueIdLong = GuidToLongID();16 Console.WriteLine("唯一码:{0}\t长度为:{1}", uniqueIdLong, uniqueIdLong.ToString().Length);17 }18 /// <summary>19 /// 由连字符分隔的32位数字20 /// </summary>21 /// <returns></returns>22 private static string GetGuid()23 {24 System.Guid guid = new Guid();25 guid = Guid.NewGuid();26 return guid.ToString();27 }28 /// <summary> 29 /// 根据GUID获取16位的唯一字符串 30 /// </summary> 31 /// <param name=\"guid\"></param> 32 /// <returns></returns> 33 public static string GuidTo16String()34 {35 long i = 1;36 foreach (byte b in Guid.NewGuid().ToByteArray())37 i *= ((int)b + 1);38 return string.Format("{0:x}", i - DateTime.Now.Ticks);39 }40 /// <summary> 41 /// 根据GUID获取19位的唯一数字序列 42 /// </summary> 43 /// <returns></returns> 44 public static long GuidToLongID()45 {46 byte[] buffer = Guid.NewGuid().ToByteArray();47 return BitConverter.ToInt64(buffer, 0);48 } 49 }50 }
2、用 DateTime.Now.ToString("yyyyMMddHHmmssms") 和 .NET Framework 提供的 RNGCryptoServiceProvider() 结合生成,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 namespace ConsoleApplication1 7 { 8 class Program 9 {10 static void Main(string[] args)11 {12 string uniqueNum = GenerateOrderNumber();13 Console.WriteLine("唯一码:{0}\t 长度为:{1}", uniqueNum, uniqueNum.Length);14 //测试是否会生成重复15 Console.WriteLine("时间+RNGCryptoServiceProvider()结合生成的唯一值,如下:");16 string _tempNum = string.Empty;17 for (int i = 0; i < 1000; i++)18 {19 string uNum = GenerateOrderNumber();20 Console.WriteLine(uNum);21 if (string.Equals(uNum, _tempNum))22 {23 Console.WriteLine("上值存在重复,按Enter键继续");24 Console.ReadKey();25 }26 //Sleep当前线程,是为了延时,从而不产生重复值。可以把它注释掉测试看27 Thread.Sleep(300);28 _tempNum = uNum;29 }30 }31 /// <summary>32 /// 唯一订单号生成33 /// </summary>34 /// <returns></returns>35 public static string GenerateOrderNumber()36 {37 string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssms");38 string strRandomResult = NextRandom(1000, 1).ToString();39 return strDateTimeNumber + strRandomResult;40 }41 /// <summary>42 /// 参考:msdn上的RNGCryptoServiceProvider例子43 /// </summary>44 /// <param name="numSeeds"></param>45 /// <param name="length"></param>46 /// <returns></returns>47 private static int NextRandom(int numSeeds, int length)48 {49 // Create a byte array to hold the random value. 50 byte[] randomNumber = new byte[length];51 // Create a new instance of the RNGCryptoServiceProvider. 52 System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();53 // Fill the array with a random value. 54 rng.GetBytes(randomNumber);55 // Convert the byte to an uint value to make the modulus operation easier. 56 uint randomResult = 0x0;57 for (int i = 0; i < length; i++)58 {59 randomResult |= ((uint)randomNumber[i] << ((length - 1 - i) * 8));60 }61 return (int)(randomResult % numSeeds) + 1;62 }63 }64 }
3、用 [0-9A-Z] + Guid.NewGuid() 结合生成特定位数的唯一字符串,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace ConsoleApplication1 6 { 7 class Program 8 { 9 static void Main(string[] args)10 {11 string uniqueText = GenerateUniqueText(8);12 Console.WriteLine("唯一码:{0}\t 长度为:{1}", uniqueText, uniqueText.Length);13 //测试是否会生成重复 14 Console.WriteLine("由[0-9A-Z] + NewGuid() 结合生成的唯一值,如下:");15 IList<string> list = new List<string>();16 for (int i = 1; i <= 1000; i++)17 {18 string _uT = GenerateUniqueText(8);19 Console.WriteLine("{0}\t{1}", list.Count, _uT);20 if (list.Contains(_uT))21 {22 Console.WriteLine("{0}值存在重复", _uT);23 Console.ReadKey();24 }25 list.Add(_uT);26 //if (i % 200 == 0)27 //{28 //Console.WriteLine("没有重复,按Enter键往下看");29 //Console.ReadKey();30 //}31 }32 list.Clear();33 }34 35 /// <summary>36 /// 生成特定位数的唯一字符串37 /// </summary>38 /// <param name="num">特定位数</param>39 /// <returns></returns>40 public static string GenerateUniqueText(int num)41 {42 string randomResult = string.Empty;43 string readyStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";44 char[] rtn = new char[num];45 Guid gid = Guid.NewGuid();46 var ba = gid.ToByteArray();47 for (var i = 0; i < num; i++)48 {49 rtn[i] = readyStr[((ba[i] + ba[num + i]) % 35)];50 }51 foreach (char r in rtn)52 {53 randomResult += r;54 }55 return randomResult;56 }57 }58 }
4、用单例模式实现,由[0-9a-z]组合生成的唯一值,此文不讨论单例模式的多种实现方式与性能问题,随便弄一种方式实现,代码如下:
Demo结构如图:
Program.cs 程序:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Collections; 6 using System.Xml; 7 namespace ConsoleApplication4 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 CreateID createID = CreateID.GetInstance(); 14 //测试是否会生成重复 15 Console.WriteLine("单例模式实现,由[0-9a-z]组合生成的唯一值,如下:"); 16 IList<string> list = new List<string>(); 17 for (int i = 1; i <= 1000000000; i++) 18 { 19 string strUniqueNum = createID.CreateUniqueID(); 20 Console.WriteLine("{0}\t{1}", list.Count, strUniqueNum); 21 if (list.Contains(strUniqueNum)) 22 { 23 Console.WriteLine("{0}值存在重复", strUniqueNum); 24 Console.ReadKey(); 25 } 26 list.Add(strUniqueNum); 27 if (i % 200 == 0) 28 { 29 Console.WriteLine("没有重复,按Enter键往下看"); 30 Console.ReadKey(); 31 } 32 } 33 list.Clear(); 34 } 35 } 36 /// <summary> 37 /// 单例模式实现 38 /// 唯一值由[0-9a-z]组合而成,且生成的每个ID不能重复 39 /// </summary> 40 public class CreateID 41 { 42 private static CreateID _instance; 43 private static readonly object syncRoot = new object(); 44 private EHashtable hashtable = new EHashtable(); 45 private string _strXMLURL = string.Empty; 46 private CreateID() 47 { 48 hashtable.Add("0", "0"); 49 hashtable.Add("1", "1"); 50 hashtable.Add("2", "2"); 51 hashtable.Add("3", "3"); 52 hashtable.Add("4", "4"); 53 hashtable.Add("5", "5"); 54 hashtable.Add("6", "6"); 55 hashtable.Add("7", "7"); 56 hashtable.Add("8", "8"); 57 hashtable.Add("9", "9"); 58 hashtable.Add("10", "a"); 59 hashtable.Add("11", "b"); 60 hashtable.Add("12", "c"); 61 hashtable.Add("13", "d"); 62 hashtable.Add("14", "e"); 63 hashtable.Add("15", "f"); 64 hashtable.Add("16", "g"); 65 hashtable.Add("17", "h"); 66 hashtable.Add("18", "i"); 67 hashtable.Add("19", "j"); 68 hashtable.Add("20", "k"); 69 hashtable.Add("21", "l"); 70 hashtable.Add("22", "m"); 71 hashtable.Add("23", "n"); 72 hashtable.Add("24", "o"); 73 hashtable.Add("25", "p"); 74 hashtable.Add("26", "q"); 75 hashtable.Add("27", "r"); 76 hashtable.Add("28", "s"); 77 hashtable.Add("29", "t"); 78 hashtable.Add("30", "u"); 79 hashtable.Add("31", "v"); 80 hashtable.Add("32", "w"); 81 hashtable.Add("33", "x"); 82 hashtable.Add("34", "y"); 83 hashtable.Add("35", "z"); 84 _strXMLURL = System.IO.Path.GetFullPath(@"..\..\") + "XMLs\\record.xml"; 85 86 } 87 public static CreateID GetInstance() 88 { 89 if (_instance == null) 90 { 91 lock (syncRoot) 92 { 93 if (_instance == null) 94 { 95 _instance = new CreateID(); 96 } 97 } 98 } 99 return _instance;100 }101 /// <summary>102 /// 创建UniqueID103 /// </summary>104 /// <returns>UniqueID</returns>105 public string CreateUniqueID()106 {107 long _uniqueid = GetGuidFromXml();108 return Convert10To36(_uniqueid);109 }110 /// <summary>111 /// 获取UniqueID总记录,即获取得到的这个ID是第几个ID112 /// 更新UniqueID使用的个数,用于下次使用113 /// </summary>114 /// <returns></returns>115 private long GetGuidFromXml()116 {117 long record = 0;118 XmlDocument xmldoc = new XmlDocument();119 xmldoc.Load(_strXMLURL);120 XmlElement rootNode = xmldoc.DocumentElement;121 //此次的个数值122 record = Convert.ToInt64(rootNode["record"].InnerText);123 //此次的个数值+1 == 下次的个数值124 rootNode["record"].InnerText = Convert.ToString(record + 1);125 xmldoc.Save(_strXMLURL);126 return record;127 }128 /// <summary>129 /// 10进制转36进制130 /// </summary>131 /// <param name="intNum10">10进制数</param>132 /// <returns></returns>133 private string Convert10To36(long intNum10)134 {135 string strNum36 = string.Empty;136 long result = intNum10 / 36;137 long remain = intNum10 % 36;138 if (hashtable.ContainsKey(remain.ToString()))139 strNum36 = hashtable[remain.ToString()].ToString() + strNum36;140 intNum10 = result;141 while (intNum10 / 36 != 0)142 {143 result = intNum10 / 36;144 remain = intNum10 % 36;145 if (hashtable.ContainsKey(remain.ToString()))146 strNum36 = hashtable[remain.ToString()].ToString() + strNum36;147 intNum10 = result;148 }149 if (intNum10 > 0 && intNum10 < 36)150 {151 if (hashtable.ContainsKey(intNum10.ToString()))152 strNum36 = hashtable[intNum10.ToString()].ToString() + strNum36;153 }154 return strNum36;155 }156 }157 /// <summary>158 /// Summary description for EHashTable159 /// </summary>160 public class EHashtable : Hashtable161 {162 private ArrayList list = new ArrayList();163 public override void Add(object key, object value)164 {165 base.Add(key, value);166 list.Add(key);167 }168 public override void Clear()169 {170 base.Clear();171 list.Clear();172 }173 public override void Remove(object key)174 {175 base.Remove(key);176 list.Remove(key);177 }178 public override ICollection Keys179 {180 get181 {182 return list;183 }184 }185 }186 }
XML:
1 <?xml version="1.0" encoding="utf-8"?>2 <root>3 <record id="record">1</record>4 </root>
二、在JS中生成GUID,类似.NET中的 Guid.NewGuid(),代码如下:
1 function newGuid() { //方法一: 2 var guid = ""; 3 var n = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); 4 for (var i = 1; i <= 8; i++) { 5 guid += n; 6 } 7 return guid; 8 } 9 function newGuid() { //方法二:10 var guid = "";11 for (var i = 1; i <= 32; i++) {12 var n = Math.floor(Math.random() * 16.0).toString(16);13 guid += n;14 if ((i == 8) || (i == 12) || (i == 16) || (i == 20))15 guid += "-";16 }17 return guid;18 }
三、在SQL存储过程生成GUID,代码如下:
1 -- ============================================= 2 -- Author: JBen 3 -- Create date: 2012-06-05 4 -- Description: 生成唯一标识ID,公共存储过程,可设置在别的存储过程调用此存储过程传不同的前缀 5 -- ============================================= 6 ALTER PROCEDURE [dbo].[pro_CreateGuid] 7 @Prefix NVARCHAR(10), 8 @outputV_guid NVARCHAR(40) OUTPUT 9 AS10 BEGIN11 -- SET NOCOUNT ON added to prevent extra result sets from12 -- interfering with SELECT statements.13 SET NOCOUNT ON;14 -- Insert statements for procedure here15 SET @outputV_guid = @Prefix + REPLACE(CAST(NEWID() AS VARCHAR(36)),'-','')16 END
阅读全文
0 0
- C#生成唯一值的方法汇总
- C#生成唯一值的方法汇总
- C#生成唯一值的方法汇总
- PHP生成唯一订单号的方法汇总
- C#生成唯一的字符串或者数字
- C# 生成唯一ID
- 两种生成唯一字符串的方法
- PHP 生成唯一编码字符的方法
- 一个常用的生成唯一订单号方法
- 一些PHP生成唯一字符串的方法
- 服务器唯一标识 id 的生成方法
- 一个常用的生成唯一订单号方法
- C# 生成全球唯一标识符
- C# Guid生成唯一标识符
- c# 生成唯一id 主键
- PHP生成唯一字符串的方法,产生唯一码的方法分析
- PHP生成唯一字符串的方法,产生唯一码的方法分析
- 分布式系统唯一ID生成方案汇总
- 众里寻他千百度 哪家单位让你再见如初?这里上市公司、股份集团任你选 | 大数据周聘汇
- 马云要让“千亿达摩院”具备盈利能力,能做到吗?
- 【案例】中国银联、光大银行基于区块链的可信电子凭证系统
- Expected one result (or null) to be returned by selectOne(), but found: 4
- Linux中表示“时间”的结构体和相关函数
- C#生成唯一值的方法汇总
- 根据电机位置对混合动力汽车的定义
- 表单的勾选删除
- cglib代理学习笔记
- 懒人读算法(三)-添加新区间
- 文件系统读写--page cache机制
- Android项目该如何选择targetSdkVersion
- 基于pf_ring特性的libpcap库安装与配置
- UIButton 扩大点击响应区域