以下生成的GUID一定不会重复吗?真的是全球唯一吗?header: objbase.h
lib:ole32.lib
GUID guid;
HRESULT hr = CoCreateGuid(&guid);

解决方案 »

  1.   

    理论上一台机器上的guid会3280年重复一次,你的机器想用几年?
      

  2.   

    应当不会重复:<资料>用GUID 即使计算机每秒产生100,00000个GUID要等到3240年以后才会有一个相同的(不是绝对的)
      

  3.   

    以下生成的GUID一定不会重复吗?真的是全球唯一吗?前题是:都是在不同的电脑上生成。并不是一台电脑上生成的header: objbase.h
    lib:ole32.lib
    GUID guid;
    HRESULT hr = CoCreateGuid(&guid);
      

  4.   

    不会重复的。。
    里面包括了你硬件的一些参数
    还有WINDOWS运行多久了的时间长度
      

  5.   

    GUID好像是根据机器上网卡的MAC地址再加上一定的算法生成的唯一的序列。
    因全世界所有网卡的MAC地址都是唯一的,且在自己的机器上再加上时间等
    因素生成。GUID肯定是唯一的。
      

  6.   

    rrrrrrrr-tttt-tttt-oooo-aa-aa-aa-aa-aa-aa
    rrrrrrrr 32位长的随机数
    tttt-tttt 时间戳,其中低16位字在前
    oooo 与机器重启次数有关
    aa-aa-aa-aa-aa-aa 一个6字节长的字符串,一般是网卡地址,
                      没有网卡的是一个常数
    我想重复的机会几乎没有吧
      

  7.   

    爱因斯坦说任何事情都是相对的.
    to: ilovevc(ilovevc) 
    如果是多CPU多线程呢.
      

  8.   

    时间上、空间上进行互斥
    这样的讨论没意思。
    即便是在多线程下重复了又怎么样呢?
    我们重在应用。
    再说COM也只是一种规范而已。
    WWW的IP也会重复,但我们还得使用.
      

  9.   

    盖世贸大厦前分析被飞机撞得概率一定很小吧,也肯定比guid重复的概率大,但世贸还是盖了,所以我们愿意冒着风险来用guid,因为这是比较可行的办法。有些事情从理论上分析概率为零,我想说不准发生的概率都要比guid重复的可能性大。
    因为没有什么是绝对的,千年虫这么简单的道理谁想的到?如果到了由于guid重复而产生灾难的那时候,人们肯定会找替代的办法了,这比解决千年虫容易多了。
      

  10.   

    如果是NC终端,运算的结果可能是重复的,如果你确保安全起见的话,在同一台计算机上运算一堆GUID出来,然后再用他们。重要的一点:保证你的网卡主板这些东西正规大厂货
      

  11.   

    最少到目前为止还没有听说过重复的GUID
      

  12.   

    "一定不会重复"
    这有什么意思呢,我可以告诉你GUID一定会重复的。
    只要给定足够的时间,那么在理论上存在可能出现的事物,一定会一遍又一遍的重复,不管它的概率是多小。我建议你去看《宇宙的最后三分钟》保尔·戴维斯著,你就会知道说一定是多么没意思的事了。当质子都不存在的时候还谈什么计算机。
      

  13.   

    考虑这种情况:   我在一台机子上生成一个GUID并------>使用之,假如被A使用。
       然后我把A使用的GUID拿到另台机子上使用。假如被B使用。
       
       接着我把B拿到A的那台机子上使用。
       
       各位说说会发生什么情况???????
       
      

  14.   

    GUID长度是有限的,在理论是当然是有可能重复的,如果有3240台机器一起运行并且按照那个速度产生GUID,平均一年就会产生一个相同的GUID。
      

  15.   

    记住这么一句话就可以了,世界上的确没有绝对,但是过于钻牛角尖不是一个好程序员的风格有网卡的机器可以保证这台机器上生成的GUID在世界上任何一台有网卡的机器上都不会出现没有网卡的机器生成的不叫GUID,至于叫什么我忘记了,似乎叫LUID,可以保证这台机器上不会出现重复的
      

  16.   

    别忘记还有你的visual studio序列号。如果你不用盗版的话,永远不会产生和别人重复的guid.
      

  17.   

    it will generate ids dupicate existing one, just the probility so low, no one cares.
      

  18.   

    I think the duplicition can't occur.
      

  19.   

    to: nscboy
    这个应该可以通过一个互斥量,或者取得cpu的参数就可以避免。>>爱因斯坦说任何事情都是相对的.
    >>如果是多CPU多线程呢.
      

  20.   

    This function(CoCreateGUID) executes the algorithm specified by OSF DCE,3 which uses a combination of the following information to generate the GUID:1. The current date and time
    2. A clock sequence and related persistent state to deal with retrograde motion of clocks
    3. A forcibly incremented counter to deal with high-frequency allocations
    4. The truly globally unique IEEE machine identifier, obtained from a network card (the implementation does not require a network card; if no network card is present, a machine identifier can be synthesized from highly variable machine states and stored persistently)因此,没有网卡的机器生成的也是一个GUID.他可能取你的硬盘参数,内存,等等一些东西。
      

  21.   

    楼主,注意了!
    我在写数据库程序时,其ID号用GUID生成,该程序用了两年了。从来没有出现过重复的情况。理论上,会重复。实际上,在我们有生之年,不会重复。放心用吧。
      

  22.   

    据说128位的GUID比宇宙中的原子还多。一定不会重复。
      

  23.   

    com 本质论上说:唯一不绝对的GUID
      

  24.   

    sunheart(深蓝) ( ) 信誉:100  2002-12-04 09:38:00  得分:0 
     
     
      楼主,注意了!
    我在写数据库程序时,其ID号用GUID生成,该程序用了两年了。从来没有出现过重复的情况。理论上,会重复。实际上,在我们有生之年,不会重复。放心用吧。
      
     你怎么想用他来产生GUID号呢!高???
      

  25.   

    GUID里包括时间及你的电脑的网卡的mac地址相关的信息,还要加上一些用于防止重复的算法产生的数据,所以不会重复,不过如果没有网卡的话就只是统计意义上的唯一了,因为现在的网卡在生产上防止了mac地址的重复
      

  26.   

    如果有网卡,不会重复,
    如果没有网卡,本机不重复,可能同其他没有网卡的机器上生成的重复。当然,理论上只要你生成2^128+1个GUID,就一定有重复的 ^_^
      

  27.   

    有可能重复。
    其机率可以用分子运动来比喻。
    分子运动方向不可预测,但完全可以相信有一天,当你和你老婆站在一起的时候,由于分子运动,你变成了你老婆,而你老婆变成了你。
    不过GUID重复的机率好象比这个还要小。
      

  28.   

    GUID 只是在概率上重复的机率很少,
    谁能想出一个从理论上都没有重复可能的解决方案吗?
      

  29.   

    我觉得所有的回答都没有解决实际问题,COM规范本身没有约定要实现这样的函数,那么我们就抛弃COM看一下实现这个函数的官方(M$)的说法:CoCreateGuid(…)是调用RPC函数 UuidCreate(…)来产生一个全球唯一的(后来我们会看到它在Windows 2000中不能生成一个全球唯一的,因为这个函数先于Windows 2000,而后来2000出来后它也没对其更正--这种错误M$是干过不少的)128位标识符,它只把UuidCreate(…)的返回值包装成了COM通用的HRESULT类型值。然后我们来看看UuidCreate(…),M$是这样说的:在Windows 2000中,UuidCreate(…)不再利用本机的 ethernet/token ring address 来生成uuid(在Windows NT 4.0, Windows 95, DCOM release, and Windows 98这些版本中都虑了 ethernet/token ring address,不再考虑的原因是:security )。这样在同一台机器上产生的uuid之间也就没有什么联系了,同时M$也在Windows 2000实现了另一个函数UuidCreateSequential (…),它是考虑了本机的ethernet/token ring address。而M$自己的说法是如果没有 ethernet/token ring address产生的标识符只能保证在产生标识符的机器上是唯一的(很容易和其它没有ethernet/token ring address的机器产生的标识符冲突),但不能保证是GUID(全球唯一),也就是说不能用来标识将要发布的COM组件,所以说在Windows  2000中调用CoCreateGuid(…)产生的标识符不是全球唯一的(从理论上它就不是了),只能叫uuid,而不能叫guid。在Windows  2000中要产生全球唯一的uuid,只能调用UuidCreateSequential (…)。
      

  30.   

    理论上是不会重复,但是如果你运气够背的话也有可能,我在公司的开发小组就遇到过一次,我们做的一个COM接口在我们的机器上用就一点事都没有,拿到有一台测试机上就出问题,后来,用VBScript写了一段代码来测试,结果输出的错误说该接口COM接口的CoClass已经有了,也就是我们生产的这个COM接口的CoClass的CLSID和那台机子上的某一个重了,我们重新生成了一个CLSID来使用结果就对了!
      

  31.   

    CoCreateGuid(&guid);可能 n 年才会重复但是谁能保证生成的guid系统中一定不存在呢?
    因为系统中所有的guid并不是都由CoCreateGuid()产生的啊。
    比如我在写一个WDM driver 的时候随便想到一个guid,就在自己的软件
    中使用了,你能保证CoCreateGuid()不再使用这个id?(不知这样理解对否?)
      

  32.   

    除非你刻意去把它弄的一样,不然这辈子你是看不到两个一样的GUID的
      

  33.   

    这个问题争论到最后怕是要超越编程的范围,上升到理论数学乃至哲学的领域中去了.我们所说的"一定不会重复"是在常识范围的,是肯定有一定的误差的,比如说"一米倒底是多长",最后连巴黎的那个尺子也不够准确了,必须用幅射波长来定义,最后呢?薛定谔干脆来了个"测不准"定律.但在我们的生活中有几个人要用巴黎的那把尺来量今天买来的裤子长度是不是3尺2寸呢?又有谁会因老薛的"测不准",而无法准确地买到3尺2寸长的裤子呢?楼主放心,GUID在大家的常识范围里是"一定不会重复"的.但假定有一天全球所有人的生命都系于某个GUID和某个GUID会不会重复的时候,我们一定不会再完全依赖这个GUID了.
      

  34.   

    shb80说的是错的
    根据MSDN, 不是不使用MAC地址了,而是使用新的算法,使得不能从UUID逆推出MAC地址,原因是为了安全性的考虑。
      

  35.   

    理论和实际上重复可能性极小(两个同样IP,同一时间0.01s才可能〈还有版本信息>生成同一个ID)但下面的重复却是有的,并且很讨厌:
    如你开发了两种不同语种但同一版本的组件,当先后安装到同一台机上就会冲突(程序虽可运行,但可面目全非)
    RichText控件就一个最好的例子(英文的显示不了汉字)
      

  36.   

    to maphy() :
       说到MSDN,请理解一下函数UuidCreateSequential(…)的Res---
    For security reasons, UuidCreate was modified so that it no longer uses a machine's MAC address to generate UUIDs. UuidCreateSequential was introduced to allow creation of UUIDs using the MAC address of a machine's Ethernet card.
      

  37.   

    to maphy() :
      在MSDN中,你对In Windows 2000, the UuidCreate function generates a UUID that cannot be traced to the ethernet/token ring address of the computer on which it was generated理解得很好,可你没搞明白,UuidCreate(…)生成的UUID是怎么使得不能从UUID逆推出MAC地址的,是因为压根儿没使用 a machine's MAC address。
       没搞明白请不要乱发表意见,这样很容易误导。
      

  38.   

    to maphy() :
        还有一点,你也疏忽了,利用本机的MAC地址,目的无非是保证空间的唯一性,M$在Windows 2000中的函数UuidCreate(…)按你想的那样利用了MAC地址,只是采用一种新的算法而使得不可逆,我想问,新的算法根据唯一的MAC地址得到的结果是不是也是结果当中唯一的呢,如果不是又怎能达到当初利用MAC地址的目的,如果是你能算法而使得它不可逆吗?