it will generate ids dupicate existing one, just the probility so low, no one cares.
I think the duplicition can't occur.
to: nscboy 这个应该可以通过一个互斥量,或者取得cpu的参数就可以避免。>>爱因斯坦说任何事情都是相对的. >>如果是多CPU多线程呢.
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.他可能取你的硬盘参数,内存,等等一些东西。
我觉得所有的回答都没有解决实际问题,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 (…)。
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.
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。 没搞明白请不要乱发表意见,这样很容易误导。
to maphy() : 还有一点,你也疏忽了,利用本机的MAC地址,目的无非是保证空间的唯一性,M$在Windows 2000中的函数UuidCreate(…)按你想的那样利用了MAC地址,只是采用一种新的算法而使得不可逆,我想问,新的算法根据唯一的MAC地址得到的结果是不是也是结果当中唯一的呢,如果不是又怎能达到当初利用MAC地址的目的,如果是你能算法而使得它不可逆吗?
lib:ole32.lib
GUID guid;
HRESULT hr = CoCreateGuid(&guid);
里面包括了你硬件的一些参数
还有WINDOWS运行多久了的时间长度
因全世界所有网卡的MAC地址都是唯一的,且在自己的机器上再加上时间等
因素生成。GUID肯定是唯一的。
rrrrrrrr 32位长的随机数
tttt-tttt 时间戳,其中低16位字在前
oooo 与机器重启次数有关
aa-aa-aa-aa-aa-aa 一个6字节长的字符串,一般是网卡地址,
没有网卡的是一个常数
我想重复的机会几乎没有吧
to: ilovevc(ilovevc)
如果是多CPU多线程呢.
这样的讨论没意思。
即便是在多线程下重复了又怎么样呢?
我们重在应用。
再说COM也只是一种规范而已。
WWW的IP也会重复,但我们还得使用.
因为没有什么是绝对的,千年虫这么简单的道理谁想的到?如果到了由于guid重复而产生灾难的那时候,人们肯定会找替代的办法了,这比解决千年虫容易多了。
这有什么意思呢,我可以告诉你GUID一定会重复的。
只要给定足够的时间,那么在理论上存在可能出现的事物,一定会一遍又一遍的重复,不管它的概率是多小。我建议你去看《宇宙的最后三分钟》保尔·戴维斯著,你就会知道说一定是多么没意思的事了。当质子都不存在的时候还谈什么计算机。
然后我把A使用的GUID拿到另台机子上使用。假如被B使用。
接着我把B拿到A的那台机子上使用。
各位说说会发生什么情况???????
这个应该可以通过一个互斥量,或者取得cpu的参数就可以避免。>>爱因斯坦说任何事情都是相对的.
>>如果是多CPU多线程呢.
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.他可能取你的硬盘参数,内存,等等一些东西。
我在写数据库程序时,其ID号用GUID生成,该程序用了两年了。从来没有出现过重复的情况。理论上,会重复。实际上,在我们有生之年,不会重复。放心用吧。
楼主,注意了!
我在写数据库程序时,其ID号用GUID生成,该程序用了两年了。从来没有出现过重复的情况。理论上,会重复。实际上,在我们有生之年,不会重复。放心用吧。
你怎么想用他来产生GUID号呢!高???
如果没有网卡,本机不重复,可能同其他没有网卡的机器上生成的重复。当然,理论上只要你生成2^128+1个GUID,就一定有重复的 ^_^
其机率可以用分子运动来比喻。
分子运动方向不可预测,但完全可以相信有一天,当你和你老婆站在一起的时候,由于分子运动,你变成了你老婆,而你老婆变成了你。
不过GUID重复的机率好象比这个还要小。
谁能想出一个从理论上都没有重复可能的解决方案吗?
因为系统中所有的guid并不是都由CoCreateGuid()产生的啊。
比如我在写一个WDM driver 的时候随便想到一个guid,就在自己的软件
中使用了,你能保证CoCreateGuid()不再使用这个id?(不知这样理解对否?)
根据MSDN, 不是不使用MAC地址了,而是使用新的算法,使得不能从UUID逆推出MAC地址,原因是为了安全性的考虑。
如你开发了两种不同语种但同一版本的组件,当先后安装到同一台机上就会冲突(程序虽可运行,但可面目全非)
RichText控件就一个最好的例子(英文的显示不了汉字)
说到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.
在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。
没搞明白请不要乱发表意见,这样很容易误导。
还有一点,你也疏忽了,利用本机的MAC地址,目的无非是保证空间的唯一性,M$在Windows 2000中的函数UuidCreate(…)按你想的那样利用了MAC地址,只是采用一种新的算法而使得不可逆,我想问,新的算法根据唯一的MAC地址得到的结果是不是也是结果当中唯一的呢,如果不是又怎能达到当初利用MAC地址的目的,如果是你能算法而使得它不可逆吗?