none
使用c#自动产生guid并转成字符串,并作为sqlite数据库主键。当数据库被移动到不同的电脑上时,在用c#产生guid时,重复的可能性有多大?

    问题

  • 标题可能没有说清楚,我详细说一下吧,由于项目本身因故,项目被使用时,会创造一些文件和sqlite数据库.db文件,这些被打包在文件夹中,并送到另一个电脑中。而另一个电脑会使用该项目打开sqlite和此文件,使用中包含向sqlite插入新的行的过程。本来想以标识列作为主键,奈何以纯数字作为主键使用的话,项目中某些地方会因为纯数字而报错,因此根本上来说纯数字作为唯一性在此项目中是不行的。

    所以考虑使用c#自动产生的guid,然后转成不带特殊符号的字符串。不过有顾虑,当数据库被移动到不同的电脑上时,在用c#产生guid向sqlite数据库插入新行时,重复的可能性有多大?,是否还得在每次guid产生的时候做个判断?然后有则重新产生一个guid,没则插入?

    或sqlite数据库有没有自带的guid产生方法?产生之后要把特殊符号给弄掉,只留下数字和字母

    2016年11月18日 14:44

答案

  • 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
    在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

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

    我以前用过java中的uuid,和guid是类似的,从未出现过重复的情况,楼主请放心!如果楼主确实担心,也是可以查询数据库验证一下的

    • 已建议为答案 Bob_Bao 2016年11月21日 3:11
    • 已标记为答案 轮回的齿轮 2016年11月21日 10:16
    2016年11月21日 1:04
  • Hi  轮回的齿轮,

    GUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 GUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 GUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),
    GUID由以下几部分的组合:
    1. 当前日期和时间,GUID的第一个部分与时间有关,如果你在生成一个GUID之后,过几秒又生成一个GUID,则第一个部分不同,其余相同。
    2. 时钟序列。
    3. 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

    在C#中可以使用下面方式获取GUID:

    using System;
    namespace Demo{
        public class Test
        {
            public static void Main()
            {
                Guid guid=Guid.NewGuid();
                Console.WriteLine(guid);
            }
        }
    }
    

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月21日 6:26
    版主

全部回复

  • 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
    在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

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

    我以前用过java中的uuid,和guid是类似的,从未出现过重复的情况,楼主请放心!如果楼主确实担心,也是可以查询数据库验证一下的

    • 已建议为答案 Bob_Bao 2016年11月21日 3:11
    • 已标记为答案 轮回的齿轮 2016年11月21日 10:16
    2016年11月21日 1:04
  • Hi  轮回的齿轮,

    GUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 GUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 GUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),
    GUID由以下几部分的组合:
    1. 当前日期和时间,GUID的第一个部分与时间有关,如果你在生成一个GUID之后,过几秒又生成一个GUID,则第一个部分不同,其余相同。
    2. 时钟序列。
    3. 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

    在C#中可以使用下面方式获取GUID:

    using System;
    namespace Demo{
        public class Test
        {
            public static void Main()
            {
                Guid guid=Guid.NewGuid();
                Console.WriteLine(guid);
            }
        }
    }
    

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月21日 6:26
    版主