生成GUID唯一值的方法匯總(dotnet/javascript/sqlserver)

一、在 .NET 中生成
1、直接用.NET Framework 提供的 Guid() 函數,此種方法使用非常廣泛。GUID(全局統一標識符)是指在一臺機器上生成的數字,它保證對在同一時空中的任何兩臺計算機都不會生成重復的 GUID 值(即保證所有機器都是唯一的)。關于GUID的介紹在此不作具體熬述,想深入了解可以自行查閱MSDN。代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{class Program{static void Main(string[] args){string _guid = GetGuid();Console.WriteLine("唯一碼:{0}\t長度為:{1}\n去掉連接符:{2}", _guid, _guid.Length, _guid.Replace("-", ""));string uniqueIdString = GuidTo16String();Console.WriteLine("唯一碼:{0}\t長度為:{1}", uniqueIdString, uniqueIdString.Length);long uniqueIdLong = GuidToLongID();Console.WriteLine("唯一碼:{0}\t長度為:{1}", uniqueIdLong, uniqueIdLong.ToString().Length);}/// <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);}  }
}

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 程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml;
namespace ConsoleApplication4
{class Program{static void Main(string[] args){CreateID createID = CreateID.GetInstance();//測試是否會生成重復 Console.WriteLine("單例模式實現,由[0-9a-z]組合生成的唯一值,如下:");IList<string> list = new List<string>();for (int i = 1; i <= 1000000000; i++){string strUniqueNum = createID.CreateUniqueID();Console.WriteLine("{0}\t{1}", list.Count, strUniqueNum);if (list.Contains(strUniqueNum)){Console.WriteLine("{0}值存在重復", strUniqueNum);Console.ReadKey();}list.Add(strUniqueNum);if (i % 200 == 0){Console.WriteLine("沒有重復,按Enter鍵往下看");Console.ReadKey();}}list.Clear();}}/// <summary>/// 單例模式實現/// 唯一值由[0-9a-z]組合而成,且生成的每個ID不能重復/// </summary>public class CreateID{private static CreateID _instance;private static readonly object syncRoot = new object();private EHashtable hashtable = new EHashtable();private string _strXMLURL = string.Empty;private CreateID(){hashtable.Add("0", "0");hashtable.Add("1", "1");hashtable.Add("2", "2");hashtable.Add("3", "3");hashtable.Add("4", "4");hashtable.Add("5", "5");hashtable.Add("6", "6");hashtable.Add("7", "7");hashtable.Add("8", "8");hashtable.Add("9", "9");hashtable.Add("10", "a");hashtable.Add("11", "b");hashtable.Add("12", "c");hashtable.Add("13", "d");hashtable.Add("14", "e");hashtable.Add("15", "f");hashtable.Add("16", "g");hashtable.Add("17", "h");hashtable.Add("18", "i");hashtable.Add("19", "j");hashtable.Add("20", "k");hashtable.Add("21", "l");hashtable.Add("22", "m");hashtable.Add("23", "n");hashtable.Add("24", "o");hashtable.Add("25", "p");hashtable.Add("26", "q");hashtable.Add("27", "r");hashtable.Add("28", "s");hashtable.Add("29", "t");hashtable.Add("30", "u");hashtable.Add("31", "v");hashtable.Add("32", "w");hashtable.Add("33", "x");hashtable.Add("34", "y");hashtable.Add("35", "z");_strXMLURL = System.IO.Path.GetFullPath(@"..\..\") + "XMLs\\record.xml";}public static CreateID GetInstance(){if (_instance == null){lock (syncRoot){if (_instance == null){_instance = new CreateID();}}}return _instance;}/// <summary>/// 創建UniqueID/// </summary>/// <returns>UniqueID</returns>public string CreateUniqueID(){long _uniqueid = GetGuidFromXml();return Convert10To36(_uniqueid);}/// <summary>/// 獲取UniqueID總記錄,即獲取得到的這個ID是第幾個ID/// 更新UniqueID使用的個數,用于下次使用/// </summary>/// <returns></returns>private long GetGuidFromXml(){long record = 0;XmlDocument xmldoc = new XmlDocument();xmldoc.Load(_strXMLURL);XmlElement rootNode = xmldoc.DocumentElement;//此次的個數值record = Convert.ToInt64(rootNode["record"].InnerText);//此次的個數值+1 == 下次的個數值rootNode["record"].InnerText = Convert.ToString(record + 1);xmldoc.Save(_strXMLURL);return record;}/// <summary>/// 10進制轉36進制/// </summary>/// <param name="intNum10">10進制數</param>/// <returns></returns>private string Convert10To36(long intNum10){string strNum36 = string.Empty;long result = intNum10 / 36;long remain = intNum10 % 36;if (hashtable.ContainsKey(remain.ToString()))strNum36 = hashtable[remain.ToString()].ToString() + strNum36;intNum10 = result;while (intNum10 / 36 != 0){result = intNum10 / 36;remain = intNum10 % 36;if (hashtable.ContainsKey(remain.ToString()))strNum36 = hashtable[remain.ToString()].ToString() + strNum36;intNum10 = result;}if (intNum10 > 0 && intNum10 < 36){if (hashtable.ContainsKey(intNum10.ToString()))strNum36 = hashtable[intNum10.ToString()].ToString() + strNum36;}return strNum36;}}/// <summary>/// Summary description for EHashTable/// </summary>public class EHashtable : Hashtable{private ArrayList list = new ArrayList();public override void Add(object key, object value){base.Add(key, value);list.Add(key);}public override void Clear(){base.Clear();list.Clear();}public override void Remove(object key){base.Remove(key);list.Remove(key);}public override ICollection Keys{get{return list;}}}
}

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,或者下方發表評論。<==

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259820.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Thread.CurrentPrincipal HttpContext.Current.User

據說要這樣寫才穩妥 // This principal will flow throughout the request.VoyagerPrincipal principal new VoyagerPrincipal(yada, yada, yada); // Attach the new principal object to the current HttpContext objectHttpContext.Current.User principal; // Make sure …

江森系統設置服務器日期,江森自控METASYS操作手冊

? Alarm? Trend顯示窗口中的按鈕編號 A B按鈕說明允許您編輯所示項目的屬性。選擇Save按鈕可保存修改。 顯示這個窗口中以前顯示過的內容。每個窗口最多可顯示5個歷史項目。顯示已保存的下一個窗口中的內容。鎖定選中的顯示窗口(防止被其他拖拽來的項目覆蓋)。您可調整被鎖定…

servlet中getWriter和getOutputStream的區別

getWriter();getOutputStream();區別&#xff1a;1、getWriter()用于向客戶機回送字符數據2、getOutputStream()返回的對象&#xff0c;可以回送字符數據&#xff0c;也可以回送字節數據&#xff08;二進制數據&#xff09;如何選擇&#xff1a;若果我們回送字符數據&#xff0…

execve系統調用_張凱捷—系統調用分析(3) (基于最新Linux5.0版本系統調用日志收集系統)...

在上一篇文章《系統調用分析(2)》中介紹和分析了32位和64位的快速系統調用指令——sysenter/sysexit和syscall/sysret&#xff0c;以及內核對快速系統調用部分的相關代碼&#xff0c;并追蹤了一個用戶態下的系統調用程序運行過程。本篇中將基于最新的Linux-5.0內核&#xff0c;…

批量下載小說網站上的小說(python爬蟲)

隨便說點什么 因為在學python&#xff0c;所有自然而然的就掉進了爬蟲這個坑里&#xff0c;好吧&#xff0c;主要是因為我覺得爬蟲比較酷&#xff0c;才入坑的。 想想看&#xff0c;你可以批量自動的采集互聯網上海量的資料數據&#xff0c;是多么令人激動啊&#xff01; 所以我…

Playground

題意 &#xff1a;求被兩點分割的凸包面積的較小值 題意已經給出順時針啦 就是求以某一個點 和其他所有相鄰點組成三角形的面積&#xff0c;然后sum存和求兩點的時候就求出那兩點的之間所有三角形的和再減掉0點和那兩點的面積一減就是其中一個三角形的面積。轉載于:https://…

華為歐拉系統服務器開接口,華為操作系統 euleros

華為操作系統 euleros 內容精選換一換Atlas 900 AI集群安裝上架、服務器基礎參數配置、安裝操作系統等操作&#xff0c;請根據集群配置參見對應的手冊&#xff1a;《Atlas 900 PoD 用戶指南 (型號9000, 直流)》《Atlas 900 PoD 用戶指南 (型號9000, 交流)》《Atlas 900 計算節點…

對勾函數_對勾函數?2020福建省中考壓軸題分析

訓練營機密視頻大公開歡迎轉發、分享傳播知識&#xff0c;傳播力量&#xff01;福建也是全省統一考選擇題&#xff1a;這題考的是二次函數的性質&#xff0c;先求出對稱軸就好了填空題&#xff1a;這題看似有反比例&#xff0c;確實會用到反比例函數的對稱性。但其實重點是考察…

這個textview有問題嗎 為什么一使用就崩潰

問題描述<TextViewandroid:id"id/textview1"android:layout_columnSpan"4"android:layout_gravity"fill"android:gravity"right"android:text"0" />public class MainActivity extends Activity {Button one;TextView…

通過Ajax解析和jQuery寫了一個小小的導航條

最近在用ajax和jquery做開發&#xff0c;所以閑來無事寫了些小導航條&#xff0c;通過ajax解析XML文件動態的創建WEB網站的導航條。 <link href"css/style.css" rel"stylesheet" type"text/css" /><script src"js/jquery-1.8.2.mi…

一次生產事故的優化經歷

在一次正常的活動促銷之后&#xff0c;客服開始陸續反饋有用戶反應在搶標的時候打不開網頁或者APP&#xff0c;在打開的時候標的就已經被搶光了&#xff0c;剛開始沒有特別的上心&#xff0c;覺得搶標不就是這樣嗎&#xff0c;搶小米手機的時候也不就這樣嗎&#xff1f;隨著活動…

mysql over rank_SQL學習筆記 - 窗口函數OVER

Window Function 窗口函數Perform calculations on an already generated result set ( a window).&#xff08;在已生成的結果集上執行計算&#xff09;Aggregate calculation(without having to group your data)&#xff08;允許使用聚合函數時不用進行GROUP BY分組&#xf…

用boost庫實現traceroute小工具

參考了網上幾個 traceroute的實現版本&#xff0c;存在一些缺陷&#xff0c;比如沒有做超時處理&#xff0c;或者只能在window下使用。自己用boost實現了一個traceroute小工具&#xff0c;在window下正常運行。 先來看下面實現的原理。這些說明來自維基百科。traceroute&#x…

Win系統利用本地安全策略全面禁止360等軟件的安裝與運行-1

這個理論應該也可以用在域對下設域用戶上.各位不知道有沒有這種經歷&#xff0c;機子讓別人玩了一上午&#xff0c;回來發現&#xff0c;自己干干凈凈的系統多了一堆某某安全助手&#xff0c;某某殺毒&#xff0c;某某手機助手等等&#xff0c;最可恨的還是不知一系列的&#x…

php配置文件php.ini的詳細解析(續)

file_uploads On //是否允許文件上傳 upload_tmp_dir "d:/wamp/tmp" //上傳文件的臨時目錄&#xff0c;默認為“/wamp/tm…

服務器iis7.5 配置文件,使用注冊表項 - Internet Information Services | Microsoft Docs

Internet 信息服務使用的注冊表項的說明07/21/2020本文內容本文介紹了 Microsoft Internet Information Services (IIS) 在 Windows 上使用的注冊表項。原始產品版本&#xff1a; Internet information Services原始 KB 數&#xff1a; 954864簡介本文還包含有關如何修改注…

access考試素材_NCRE考試當天常見問題處理辦法及各科目注意事項大匯總

溫馨提醒為了方便大家在21-22號討論考試抽中的題目&#xff0c;請自覺加入QQ群&#xff1a;776167039考試當天常見問題及處理辦法大匯總問題一&#xff1a;考試當天忘記帶身份證和準考證原因&#xff1a;這種情況&#xff0c;要么是忘了&#xff0c;要么真沒有提前領到準考證。…

騰訊開源手游熱更新方案,Unity3D下的Lua編程

寫在前面\\xLua是Unity3D下Lua編程解決方案&#xff0c;自2016年初推廣以來&#xff0c;已經應用于十多款騰訊自研游戲&#xff0c;因其良好性能、易用性、擴展性而廣受好評。現在&#xff0c;騰訊已經將xLua開源到GitHub。\\2016年12月末&#xff0c;xLua剛剛實現新的突破&…

設置安全性根據Folder關聯的條目模板設置上傳文檔安全性

文章結束給大家來個程序員笑話&#xff1a;[M] 在XT上可以設預條目模板&#xff08;EntryTemplate&#xff09;來到達模板化制控上傳文檔安全性和屬性等信息的作用。而EntryTemplate本身可以與Folder相干聯&#xff08;一個Folder可以關聯多個EntryTemplate&#xff09;&#x…

surfaceView中的線程問題

問題描述我在surfaceView中的surfaceCreated方法中start線程&#xff0c;但是當我start一個其他activity后&#xff0c;又finish掉那個acvitity回來&#xff0c;又會走到這個surfaceCreated方法&#xff0c;這時候走到線程的start方法&#xff0c;它會報錯Thread already exist…