欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

C# GUID 知识点 有大用 有大大用

GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。 GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。


在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如如注册表项、类及接口标识、数据库、系统目录等对象。


GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个32位十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。


 ★GUID在空间上和时间上具有唯一性,保证同一时间不同地方产生的数字不同。 ★世界上的任何两台计算机都不会生成重复的 GUID 值。 ★需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理。 ★GUID的长度固定,并且相对而言较短小,非常适合于排序、标识和存储。


 


疑问:GUID真不会重复吗?(这是我疑问的地方,我写个程序不断生成GUID每秒几万次的产生不同的GUID,按数学的逻辑随着时间的增加总会将128位全部遍历个遍,总会有相同的吧)


答(摘自百度知道):GUID好像是根据机器上网卡的MAC地址再加上一定的算法生成的唯一的序列。因全世界所有网卡的MAC地址都是唯一的,且在自己的机器上再加上时间等因素生成。GUID肯定是唯一的。 在一个合理的时间范围内,不会重复。他的算法,至少有两个主要的参数,一个是时间,另外一个就是你机器的软、硬件信息,用来定位你使用的电脑。同一台电脑不可能在同一时间运行两个GUID的算法,因此,你可以认为他是唯一的。


算法信息:


算法:


GUID的算法并不唯一,可以由多种方法来生成。


GUID生成器除了标识不同的时间,还要唯一地标识不同的地点,这可以使用网卡的48位的IEEE 802地址。


GUID的128位可以分为16个字节,前8个字节是时间和版本号,中间2个字节是UUID变体和时钟序数,后6个字节标识地点。



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| time_low |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| time_mid | time_hi_and_version |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|clk_seq_hi_res | clk_seq_low | node (0-1) |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| node (2-5) |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+




UUID变体位于第9个字节的前3位,有4种定义:


Msb0 Msb1 Msb2 Description


0 - - Reserved, NCS backward compatibility.


1 0 - The variant specified in this document.


1 1 0 Reserved, Microsoft Corporation backward

compatibility


1 1 1 Reserved for future definition.


版本号位于第7个字节的前4位:


Msb0 Msb1 Msb2 Msb3 Version Description


0 0 0 1 1 The time-based version

specified in this

document.


0 0 1 0 2 Reserved for DCE

Security version, with

embedded POSIX UIDs.


0 0 1 1 3 The name-based version

specified in this

document


0 1 0 0 4 The randomly or pseudo-

randomly generated

version specified in

this document


时间的标识(Timestamp)


UUID version 1, UTC时间从 00:00:00.00, 15 October 1582开始以100纳秒的计数.

没有UTC时间时,也可以使用当地时间,只要在系统中保持一贯就行,这并不推荐,

当地时间与UTC时间只是一个时差的问题。

UTC - Coordinated Universal Time


UUID version 3, 由名字空间产生一个60位数.


UUID version 4, 随机地或伪随机地产生一个60位数.


时钟序数 Clock sequence


UUID version 1, 时钟序数用来避免钟表被调慢后产生重复。比如网卡移到别的机器上,或者断电等。

如果先前的时钟序数已知,加1即可,否则随机产生,更换随机数种子以减小重复的可能性。


UUID version 3, 由名字空间产生一个14位数.


地点的标识(node)


UUID version 1, 采用主机的IEEE 地址,系统有多个IEEE 802地址时,任取一个;


没有IEEE地址时,使随机数或伪随机数并保证与网卡上地址不同(见 section 4).


UUID version 3, 由名字空间产生一个48位数.


UUID version 4, 随机地或伪随机地产生一个48位数.


 


C#代码:


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;


namespace WriteGuid

{undefined

    public partial class Form1 : Form

    {undefined

        public Form1()

        {undefined

            InitializeComponent();

        }


        private void btnOk_Click(object sender, EventArgs e)

        {undefined

            MessageBox.Show("本次生成的是:"+System.Guid.NewGuid().ToString());

        }

    }

}



来自:

https://blog.csdn.net/sat472291519/article/details/7836099




C#生成Guid的几种方式

1 var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12

2  var uuidN = Guid.NewGuid().ToString("N"); // e0a953c3ee6040eaa9fae2b667060e09

3  var uuidD = Guid.NewGuid().ToString("D"); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12

4  var uuidB = Guid.NewGuid().ToString("B"); // {734fd453-a4f8-4c5d-9c98-3fe2d7079760}

5  var uuidP = Guid.NewGuid().ToString("P"); // (ade24d16-db0f-40af-8794-1e08e2040df3)

6  var uuidX = Guid.NewGuid().ToString("X"); // {0x3fa412e3,0x8356,0x428f,{0xaa,0x34,0xb7,0x40,0xda,0xaf,0x45,0x6f}}

来自  https://www.cnblogs.com/shiyh/p/10966059.html



C#中GUID的使用

     最近在sqlserver 中执行一段insert脚本时,发现抛出了“超出字段长度”的异常,经检查原来是字段类型不一致造成的,GUID占用字符长度为36,而字段声明长度却是varchar(32),通过对比发现,GUID的默认格式为"

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,恰恰是多了四个"-",怎样才能去掉这几个字符呢?

     本来想使用string中的函数,却偶然在网上发现功能强大的string格式函数。

     格式说明:

     System.Guid.NewGuid().ToString(format) 
     格式说明符            
     返回值的格式

     N 32位:
     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     如:e92b8e30a6e541f6a6b9188230a23dd2
     D 由连字符分隔的32位数字:                                    
     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
     如:e92b8e30-a6e5-41f6-a6b9-188230a23dd2
     B 括在大括号中、由连字符分隔的32位数字:      
     {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
     如:{e92b8e30-a6e5-41f6-a6b9-188230a23dd2}
     P 括在圆括号中、由连字符分隔的32位数字:        
     (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
     如:(e92b8e30-a6e5-41f6-a6b9-188230a23dd2)


默认格式:4575c4b3-7997-4f11-acd9-f107258e9adc
N格式:a53a7186b583483aa4580519034e8095
D格式:5ae7f002-a989-4345-864b-3bcfbe09e1da
B格式:{d9762660-8461-4c44-b714-8ffad6e1b79c}
P格式:(694ce704-0a7d-41d5-a25a-4eaedf7db50d)
X格式:{0x75198f26,0xac4e,0x42c8,{0x96,0x88,0xcc,0x91,0xe0,0xa6,0x9b,0x21}


来自  https://www.cnblogs.com/BensonHe/archive/2011/01/28/1947072.html


普通分类: