當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)
生活随笔
收集整理的這篇文章主要介紹了
生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、在 .NET 中生成
1、直接用.NET Framework 提供的 Guid() 函數,此種方法使用非常廣泛。GUID(全局統一標識符)是指在一臺機器上生成的數字,它保證對在同一時空中的任何兩臺計算機都不會生成重復的 GUID 值(即保證所有機器都是唯一的)。關于GUID的介紹在此不作具體熬述,想深入了解可以自行查閱MSDN。代碼如下:
2、用 DateTime.Now.ToString("yyyyMMddHHmmssms") 和 .NET Framework 提供的 RNGCryptoServiceProvider() 結合生成,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 {class Program{static void Main(string[] args){string uniqueNum = GenerateOrderNumber();Console.WriteLine("唯一碼:{0}\t 長度為:{1}", uniqueNum, uniqueNum.Length);//測試是否會生成重復Console.WriteLine("時間+RNGCryptoServiceProvider()結合生成的唯一值,如下:");string _tempNum = string.Empty;for (int i = 0; i < 1000; i++){string uNum = GenerateOrderNumber();Console.WriteLine(uNum);if (string.Equals(uNum, _tempNum)){Console.WriteLine("上值存在重復,按Enter鍵繼續");Console.ReadKey();}//Sleep當前線程,是為了延時,從而不產生重復值。可以把它注釋掉測試看Thread.Sleep(300);_tempNum = uNum;}}/// <summary>/// 唯一訂單號生成/// </summary>/// <returns></returns>public static string GenerateOrderNumber(){string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssms");string strRandomResult = NextRandom(1000, 1).ToString();return strDateTimeNumber + strRandomResult;}/// <summary>/// 參考:msdn上的RNGCryptoServiceProvider例子/// </summary>/// <param name="numSeeds"></param>/// <param name="length"></param>/// <returns></returns>private static int NextRandom(int numSeeds, int length){// Create a byte array to hold the random value. byte[] randomNumber = new byte[length];// Create a new instance of the RNGCryptoServiceProvider. System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();// Fill the array with a random value. rng.GetBytes(randomNumber);// Convert the byte to an uint value to make the modulus operation easier. uint randomResult = 0x0;for (int i = 0; i < length; i++){randomResult |= ((uint)randomNumber[i] << ((length - 1 - i) * 8));}return (int)(randomResult % numSeeds) + 1;}} }3、用 [0-9A-Z] + Guid.NewGuid() 結合生成特定位數的唯一字符串,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program{static void Main(string[] args){string uniqueText = GenerateUniqueText(8);Console.WriteLine("唯一碼:{0}\t 長度為:{1}", uniqueText, uniqueText.Length);//測試是否會生成重復 Console.WriteLine("由[0-9A-Z] + NewGuid() 結合生成的唯一值,如下:");IList<string> list = new List<string>();for (int i = 1; i <= 1000; i++){string _uT = GenerateUniqueText(8);Console.WriteLine("{0}\t{1}", list.Count, _uT);if (list.Contains(_uT)){Console.WriteLine("{0}值存在重復", _uT);Console.ReadKey();}list.Add(_uT);//if (i % 200 == 0)//{//Console.WriteLine("沒有重復,按Enter鍵往下看");//Console.ReadKey();//} }list.Clear();}/// <summary>/// 生成特定位數的唯一字符串/// </summary>/// <param name="num">特定位數</param>/// <returns></returns>public static string GenerateUniqueText(int num){string randomResult = string.Empty;string readyStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";char[] rtn = new char[num];Guid gid = Guid.NewGuid();var ba = gid.ToByteArray();for (var i = 0; i < num; i++){rtn[i] = readyStr[((ba[i] + ba[num + i]) % 35)];}foreach (char r in rtn){randomResult += r;}return randomResult;}} }4、用單例模式實現,由[0-9a-z]組合生成的唯一值,此文不討論單例模式的多種實現方式與性能問題,隨便弄一種方式實現,代碼如下:
Program.cs 程序:
XML:
<?xml version="1.0" encoding="utf-8"?> <root><record id="record">1</record> </root>二、在JS中生成GUID,類似.NET中的 Guid.NewGuid(),代碼如下:
function newGuid() { //方法一:var guid = "";var n = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);for (var i = 1; i <= 8; i++) {guid += n;}return guid; } function newGuid() { //方法二:var guid = "";for (var i = 1; i <= 32; i++) {var n = Math.floor(Math.random() * 16.0).toString(16);guid += n;if ((i == 8) || (i == 12) || (i == 16) || (i == 20))guid += "-";}return guid; }三、在SQL存儲過程生成GUID,代碼如下:
ALTER PROCEDURE [dbo].[pro_CreateGuid] @Prefix NVARCHAR(10),@outputV_guid NVARCHAR(40) OUTPUT AS BEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;-- Insert statements for procedure hereSET @outputV_guid = @Prefix + REPLACE(CAST(NEWID() AS VARCHAR(36)),'-','') END?
參考:http://www.jb51.net/article/43823.htm
?
以下我整理了一份dotnet使用的GUID庫:
/// <summary>/// Guid生成工具/// </summary>public class GuidHelper{/// <summary>/// 由連字符分隔的32位數字/// </summary>/// <returns></returns>private static string GetGuid(){System.Guid guid = new Guid();guid = Guid.NewGuid();return guid.ToString();}/// <summary> /// 根據GUID獲取16位的唯一字符串 /// </summary> /// <param name=\"guid\"></param> /// <returns></returns> public static string GuidTo16String(){long i = 1;foreach (byte b in Guid.NewGuid().ToByteArray())i *= ((int)b + 1);return string.Format("{0:x}", i - DateTime.Now.Ticks);}/// <summary> /// 根據GUID獲取19位的唯一數字序列 /// </summary> /// <returns></returns> public static long GuidToLongID(){byte[] buffer = Guid.NewGuid().ToByteArray();return BitConverter.ToInt64(buffer, 0);}/// <summary>/// 唯一訂單號生成/// </summary>/// <returns></returns>public static string GenerateOrderNumber(){string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssms");string strRandomResult = NextRandom(1000, 1).ToString();return strDateTimeNumber + strRandomResult;}/// <summary>/// 參考:msdn上的RNGCryptoServiceProvider例子/// </summary>/// <param name="numSeeds"></param>/// <param name="length"></param>/// <returns></returns>private static int NextRandom(int numSeeds, int length){// Create a byte array to hold the random value. byte[] randomNumber = new byte[length];// Create a new instance of the RNGCryptoServiceProvider. System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();// Fill the array with a random value. rng.GetBytes(randomNumber);// Convert the byte to an uint value to make the modulus operation easier. uint randomResult = 0x0;for (int i = 0; i < length; i++){randomResult |= ((uint)randomNumber[i] << ((length - 1 - i) * 8));}return (int)(randomResult % numSeeds) + 1;}/// <summary>/// 生成特定位數的唯一字符串/// </summary>/// <param name="num">特定位數</param>/// <returns></returns>public static string GenerateUniqueText(int num){string randomResult = string.Empty;string readyStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";char[] rtn = new char[num];Guid gid = Guid.NewGuid();var ba = gid.ToByteArray();for (var i = 0; i < num; i++){rtn[i] = readyStr[((ba[i] + ba[num + i]) % 35)];}foreach (char r in rtn){randomResult += r;}return randomResult;}?
==>如有問題,請聯系我:easonjim#163.com,或者下方發表評論。<==總結
以上是生活随笔為你收集整理的生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [密码学基础][每个信息安全博士生应该知
- 下一篇: unity开发罗技G29方向盘(制作操作