问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函数;
查阅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函数;
假如你的电脑中有网卡,那么GUID中含有MAC地址信息,否则含有其他硬件信息;
此外还含有当前时间(年月日时分秒毫秒)信息;
此外还含有盖茨帐户余额信息(这是原书作者加的,呵呵)。
总之呢,128 比特可以有 2^128 种排列,全球唯一当然是可能的。
还有一个你无法阻止其改变的值:GetTickCount;如果GUID采集了该信息,那么是不是可以保证不重复?