如何为delphi应用程序快速生成唯一的计算机ID? 我以前用c#很容易做到这一点,但有时失败了。我确实希望ID是“静态的”,但我不在乎是因为硬件更改或操作系统重新安装而导致id更改,我打算将其存储在注册表中并在应用启动时检查它,如果它已更改更新注册表。 (我知道如何对注册表部分进行编码,我只需要有关唯一ID的帮助。)
感谢。
答案 0 :(得分:6)
答案 1 :(得分:4)
查看SysUtils.CreateGUID,它创建一个全局唯一标识符。语法:
function CreateGUID(out Guid: TGUID): HResult; stdcall;
从D2010的帮助中取得的一个小例子:
{
This example demonstrates the usage of some GUID
related routines along with the type itself.
}
procedure TForm2.FormCreate(Sender: TObject);
var
MyGuid0, MyGuid1 : TGUID;
begin
{ Create a new GUID from the string representation. }
MyGuid0 := StringToGUID('{00020400-0000-0000-C000-000000000046}');
Memo1.Lines.Add('The GUID is: ' + GUIDToString(MyGuid0));
{
Accessing GUID's internal fields
Using the Format function to obtain the same output as GUIDToString
}
Memo1.Lines.Add(Format('GUID using formatting is: ' +
'{%0.8X-%0.4X-%0.4X-%0.2X%0.2X-%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X}',
[MyGuid0.D1, MyGuid0.D2, MyGuid0.D3,
MyGuid0.D4[0], MyGuid0.D4[1], MyGuid0.D4[2], MyGuid0.D4[3],
MyGuid0.D4[4], MyGuid0.D4[5], MyGuid0.D4[6], MyGuid0.D4[7]]));
{ Autogenerate a random GUID at run time. }
if CreateGUID(MyGuid1) <> 0 then
Memo1.Lines.Add('Creating GUID failed!')
else
Memo1.Lines.Add('The generated guid is: ' + GUIDToString(MyGuid1));
{ Generating second random GUID. }
CreateGUID(MyGuid0);
{ Testing if two guids are equal. }
if IsEqualGUID(MyGuid0, MyGuid1) then
Memo1.Lines.Add('This cannot happen! CreateGUID guarantees that ' +
'2 randomly generated GUIDs cannot be equal!');
end;
HTH
答案 2 :(得分:2)
我不确定你在问什么?如果您澄清了为什么需要“唯一的计算机ID”,这可能会有所帮助。
位:
“我计划将其存储在注册表中并在应用启动时进行检查,如果更改则更新注册表。”
给我的印象是你试图检测应用程序的不同(较新)版本和/或识别套件中的不同应用程序。
如果是这种情况,那么只需按Ctrl+Shift+G
将为您生成一个唯一的GUID,并将其插入代码中当前的光标位置。
您可能还想查看版本信息;也许自动增加内部数字?
如果您尝试以某种方式识别不同计算机上的唯一安装,请查看普通答案中的CreateGUID
函数。
您提到您“不关心ID是否因硬件更改或操作系统重新安装而更改”。我不确定这是否是一个重要的事实:您正在尝试检测硬件更改?毕竟,你确实说过你不在乎;但是为什么要提这个呢?
我没有考虑过的其他事情?
答案 3 :(得分:0)
您可以尝试使用UUID算法,原因如下:
但请注意:要实现硬件独立性,必须选择一些不使用机器MAC地址的算法。微软的GUID使用它(这是他们如何发现谁写了那个爱你的病毒,还记得吗?)