问guid的生成原理:好比这么一个{0CF32AA1-7571-11D0-93C4-00AA00A3DDEA}是如何生成的,并且如何保证其global unique;
查阅delphi的SysUtils.pas,其在windows下仅仅简单调用ole32.dll里的CoCreateGuid api来解决问题;在linux下是采用如后代码解决:另外在本人机上测试,每秒能生成1319171个guid(cpu:551MHZ,mem:256MB,NT5.0 server),因此把guid都用光的阴谋不大可能(50亿台计算机闲着无聊穷算guid)实现;不过最关注的问题是其如何保证唯一性(尽管其能依赖mac地址确保不同机器之间的差异,但如何确保在同一机器上的唯一性?其算法应与时间有关,但如何确保在1ms里不生成两个同样的id?)
我是想用其作它用。//附for linux代码
var
  libuuidHandle: Pointer;
  uuid_generate_time: procedure (out Guid: TGUID) cdecl;function CreateGUID(out Guid: TGUID): HResult;const
  E_NOTIMPL = HRESULT($80004001);begin
  Result := E_NOTIMPL;
  if libuuidHandle = nil then
  begin
    libuuidHandle := dlopen('libuuid.so.1', RTLD_LAZY);
    if libuuidHandle = nil then Exit;
    uuid_generate_time := dlsym(libuuidHandle, 'uuid_generate_time');
    if @uuid_generate_time = nil then Exit;
  end;
  uuid_generate_time(Guid);
  Result := 0;
end;
看不懂,关键找不到uuid_generate_time函数;

解决方案 »

  1.   

    记得《Windows程序设计》大概有如下解释:
    假如你的电脑中有网卡,那么GUID中含有MAC地址信息,否则含有其他硬件信息;
    此外还含有当前时间(年月日时分秒毫秒)信息;
    此外还含有盖茨帐户余额信息(这是原书作者加的,呵呵)。
    总之呢,128 比特可以有 2^128 种排列,全球唯一当然是可能的。
      

  2.   

    如果设计这样一个无聊的软件,在同一台机器上(有网卡)不停生成guid,并且将生成时间限定在同一ms,也即在适当时刻修改时间,好比说:总是在1981-06-01,06时23分32秒337ms时刻生成guid;是否能出现两个重复的id?
      

  3.   

    我的猜想:
    还有一个你无法阻止其改变的值:GetTickCount;如果GUID采集了该信息,那么是不是可以保证不重复?
      

  4.   

    网卡地址+cpu内部计数,永远不可能重复。