zoukankan      html  css  js  c++  java
  • GUID

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法很有意思,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。GUID的唯一缺陷在于生成的结果串会比较大。”

    1. 一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数。

    2. GUID 的 格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的 数字。例如:337c7f2b-7a34-4f50-9141-bab9e6478cc8 即为有效的 GUID 值。

    3. 世界上(Koffer注:应该是地球上)的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。

    4. 在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。

    .NET中使用GUID

    当Windows开发人员需要一个唯一数值时,他们通常使用到一个全局唯一标识符(GUID, Globally Unique Identifier)。微软采用GUID术语来表示这一唯一数值,而这一数值能够标识一个实体,比如一个Word文档。

    一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数。

    这一篇文章将解释.NET框架如何尽其最大潜力地为你建立自己的GUID。

    你所看到的

    GUIDs被用于整个Windows环境。当你在一个Windows系统中仔细阅读注册表时,你可以看到GUIDs被广泛用于唯一识别程序。特别地,它们作为程序的Ids集中在HKEY_CLASSES_ROOT部分(AppID键)。

    这就是一个典型的GUID的格式:

    936DA01F-9ABD-4d9d-80C7-02AF85C822A8

    在.NET中生成一个GUID

    处理一个唯一标识符使得存储和获得信息变得更加容易。在处理一个数据库中这一功能变得尤其有用,因为一个GUID能够操作一个主键。

    同 样,SQL Server也很好地集成了GUID的用途。SQL Server数据类型uniqueidentifier能够存储一个GUID数值。你可 以通过使用NEWID()函数在SQL Server中生成这一数值,或者可以在SQL Server之外生成GUID,然后再手动地插入这一数值。

    在.NET中,后面一种方法显得更加直接。.NET Framework中的基本System类包括GUID数值类型。除此之外,这一数值类型包含了处理GUID数值的方法。特别地,NewGUID方法允许你很容易地生成一个新的GUID。

    以下的C#命令行程序说明这一使用过程:
    using System;
    namespace DisplayGUID {
    class GuidExample {
    static void Main(string[] args) {
    Console.WriteLine("GUID: " + System.Guid.NewGuid().ToString());
    }
    } }

    下面为这一程序的输出:(虽然不同系统之间的GUID是变化的。)

    GUID: 9245fe4a-d402-451c-b9ed-9c1a04247482

    在这一点上,你可以看到GUID是一个很好的功能,但在程序的什么地方使用到它们,并如何使用它们?

    在程序中使用一个GUID

    一个GUID可以在后台数据库中操作一个主键。以下代码使用一个GUID在一个后台数据库中存储信息,这一数据库包含以下的列:

    pk_guid—uniqueidentifier数据类型
    name—nvarchar数据类型
    这样出现一个包含文本框的简单Windows窗体。当选择按钮时,文本框中的数据被插入到数据库中。通过程序代码可以生成一个GUID并存储在其它列中:

    StringBuilder strSql = new StringBuilder();
    strSql.Append("Insert into cs_Content(");
    strSql.Append("Log_guid, Log_Title, Log_Content, Log_PostTime, Log_ViewNums)");
    strSql.Append(" values (");
    strSql.Append("@Log_guid, @Log_Title, @Log_Content, @Log_PostTime, @Log_ViewNums)");

    DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString());

    string guid = Guid.NewGuid().ToString();
    // Add parameters
    db.AddInParameter(dbCommand, "Log_guid", DbType.String, guid);
    db.AddInParameter(dbCommand, "Log_Title", DbType.String, model.Log_Title);
    db.AddInParameter(dbCommand, "Log_Content", DbType.String, model.Log_Content);
    db.AddInParameter(dbCommand, "Log_PostTime", DbType.DateTime, model.Log_PostTime);
    db.AddInParameter(dbCommand, "Log_ViewNums", DbType.Int32, model.Log_ViewNums);

    int res = db.ExecuteNonQuery(dbCommand);


    另一个GUID程序将一个唯一的标识符分配给一个.NET类或者接口,也就是说,GUID作为一个属性被分配给类或者接口。可以使用标准属性语法来实现这一过程

    我们可以扩展第一个范例来分配一个GUID。System.Runtime.InteropServices空间名称必须被引用来使用GUID属性。以下C#代码实现了这一过程:

    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;

    // 有关程序集的常规信息通过下列属性集
    // 控制。更改这些属性值可修改
    // 与程序集关联的信息。
    [assembly: AssemblyTitle("Test")]

    // 将 ComVisible 设置为 false 使此程序集中的类型
    // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
    // 则将该类型上的 ComVisible 属性设置为 true。
    [assembly: ComVisible(false)]

    // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("198cfad8-041f-4141-8961-776b29af7a06")]

    // 程序集的版本信息由下面四个值组成:
    //
    //       主版本
    //       次版本
    //       内部版本号
    //       修订号
    //
    // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
    // 方法是按如下所示使用“*”:
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]

    GUID永远是方便的
    对于程序开发的各个方面,.NET Framework简化了建立和处理GUID数值的过程。在.NET程序需要的地方,这一功能很容易地生成唯一的数值。

    ------------
    1、Guid.NewGuid().ToString("N") 结果为:
         38bddf48f43c48588e0d78761eaa1ce6
    2、Guid.NewGuid().ToString("D") 结果为:
         57d99d89-caab-482a-a0e9-a0a803eed3ba
    3、Guid.NewGuid().ToString("B") 结果为:
         {09f140d5-af72-44ba-a763-c861304b46f8}
    4、Guid.NewGuid().ToString("P") 结果为:
         (778406c2-efff-4262-ab03-70a77d09c2b5)
    可见默认的为第2种效果

    将字符串形式的GUID:EF41A66B-25E1-46B2-964B-E4F70534807F转换为System.Guid类型
    System.Guid mGuid=new Guid("EF41A66B-25E1-46B2-964B-E4F70534807F");
    -----------------
    guid的每段位数:8+4+4+4+12
    -------------------
    GUID重复的可能性几乎为0,可放心使用,重复的机率比碰鬼的机率还小,在不同的机器上如此,在同一台机器上重复的机率更是几乎不可能
    使用C#Guid.NewGuid()生成的GUID长度为36位
     
    ef81392c-e084-42ff-8b49-130a01df1b6a
    8-4-4-4-12
  • 相关阅读:
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    linux中的cd ..和cd -命令有什么区别?
    GCC使用
  • 原文地址:https://www.cnblogs.com/anan/p/2003849.html
Copyright © 2011-2022 走看看