一、在 .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,或者下方发表评论。<==

生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)相关推荐

  1. ABAP中生成GUID、UUID的方法汇总

    GUID(Globally Unique Identifier)全局唯一标识符,其广泛应用于各种程序中,在一些场景下,我们经常使用GUID作为主键.那么,在ABAP中,生成GUID的方式有哪些呢? 1 ...

  2. C++生成GUID的两种方法

    C++生成GUID的两种方法 C++生成GUID的两种方法 使用CoCreateGuid函数 使用Boost库 C++生成GUID的两种方法 GUID是软件开发中常用的组件,用于生成唯一的对象,在C# ...

  3. thinkphp生成guid 唯一识别码

    thinkphp生成guid 唯一识别码 很多情况下需要生成唯一识别码,比如像商城订单.统一下单等 大家可以看看~ function guid() {if (function_exists('com_ ...

  4. javascript 实现生成GUID / UUID的多种方法

    GUID(全局唯一标识符)或(UUID)通用唯一标识符是一个 16 字节的二进制值,是旨在提供某些唯一性保证的标识符. Math.Random Javascript 中使用 Math.Random() ...

  5. php生成随机数永不重复,PHP生成不重复随机数的方法汇总

    本文汇总了5种生成不重复随机数的方法,其中方法一.二.三是本人常用的方法,方法四五来至度娘.其余方法还是有的,也欢迎大家将遗漏的方法告之,大家共同进步 方法一: $numbers = range (1 ...

  6. excel中提取不重复值(唯一值)方法大全

    Excel使用过程中,有很多场合都需要获取一组数据的不重复值.获取不重复值的方法有很多,例如高级筛选法.透视表法.基础操作法和公式法.本例分别向大家介绍这四种方法如何使用. 工具/原料 Excel 高 ...

  7. Excel 计算重复项中的唯一值的方法

    计算重复项中的唯一值 假设你想要了解包含重复值的范围中有多少个唯一值. 例如,如果列包含: 值 5.6.7 和 6,结果为三个唯一值 - 5.6 和 7. 值"Bradley".& ...

  8. snowflake算法 php,PHP实现Snowflake生成分布式唯一ID的方法示例

    前言 Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少.使用 snowflake 生成 UUID 很多都是在 ...

  9. 一种随机生成加密盐值的方法

    密码加密的时候,可以选择性的添加随机值与密码明文拼接,然后md5加密,获得加密后的密码.下面是一种获得随机值的方法: public static String getRandomSalt() { St ...

最新文章

  1. Linux0.11进程分配时间片的策略
  2. [转]Python 字符串操作实现代码(截取/替换/查找/分割)
  3. Elasticsearch索引备份与清理
  4. python课程开课吧怎么样-开课吧最新廖雪峰Python商业爬虫课程,全套完整课程资源下载...
  5. keras实现Segnet、FCN、U-Net系列分割网络
  6. C语言中使输入的字符串反序输出,C语言: 写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。...
  7. java开发webservice接口_webservice接口的开发和调用
  8. Java多线程:同步集合与同步锁
  9. Web浏览器发送POST请求
  10. python等比例压缩图片_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
  11. LT培训Hadoop
  12. 学习Java时,要记住的知识点太多,记不住怎么办?
  13. Logisitc Regression 预测员工离职率
  14. 浅谈RabbitMQ的基石—高级消息队列协议(AMQP)
  15. OpenCV使用findContours()查找轮廓
  16. 想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(一)
  17. 手机计算机软件删除了怎么恢复,电脑的程序软件不小心被删掉,该如何恢复?...
  18. [附源码]java毕业设计本科毕业设计过程管理系统
  19. 专访容智信息柴亚团:终极愿景是助力天下企业成为数字化孪生组织
  20. word2007表格计算机,【word2007的表格怎么拆分?这个计算机技能别说你还不会】- 环球网校...

热门文章

  1. 媒体转码切片_移动、咪咕携手华为实现5G网络切片应用大型直播
  2. 【写作】Texlive和Texmaker学习
  3. MVC是什么?(转载)
  4. [BZOJ]3173: [Tjoi2013]最长上升子序列
  5. windows linux 子系统折腾记
  6. 本地存储cookie和localStorage区别特点
  7. Core Java Volume I — 3.6. Strings
  8. js(function(){alert(‘’‘)})
  9. python的异常处理
  10. iOS: 在Object-C中监听javascript事件( Javascript communicating back with Objective-C code)