如何在Delphi上生成唯一的计算机ID?

6

如何快速为Delphi应用程序生成唯一的计算机ID?我曾经使用C#很容易地完成这个任务,但有时会失败。我希望ID是“静态的”,但如果由于硬件更改或操作系统重新安装而更改了ID,我并不在意。我打算将其存储在注册表中,并在应用程序启动时检查它,如果更改则更新注册表。(我知道如何编写注册表部分,只需要帮助生成唯一ID)。

谢谢。

4个回答

6

1
现在也在stackoverflow上:链接腐败。 - dummzeuch

5

请查看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


8
问题在于它并不是特定于机器的,再次调用Createguid会创建一个不同的ID。我认为用户希望每次请求时生成相同的ID。 - skamradt
@skamradt 如果GUID已经存在于注册表中的某个预定位置,则无需生成新的GUID - 因此每次请求时ID将“相同”。但是,通过使用硬件组件的序列号,ID会在该特定组件升级后立即更改。OP没有解释为什么需要这个ID,但这种方法肯定会产生符合OP 实际要求的东西。 - Disillusioned

2
我不确定你在问什么?如果你能澄清为什么需要“唯一电脑id”,可能会更有帮助。根据以下引用:“我打算将其存储在注册表中,并在应用程序启动时检查它,如果更改了更新注册表。” 我的印象是您正在尝试检测应用程序的不同(更新)版本和/或识别套件中的不同应用程序。如果是这种情况,那么简单地按Ctrl+Shift+G将为您生成一个唯一的GUID,并将其插入到代码中的当前光标位置。您可能还想查看版本信息;也许自动增加构建号码?如果您正在尝试以某种方式识别不同计算机上的唯一安装,则可以查看plainth答案中的CreateGUID函数。您提到您“不在乎id因硬件更改或操作系统重新安装而更改”。我不确定这是否是一个重要的事实,例如:您正在尝试检测硬件更改?毕竟,您确实说过您“不在乎”;但为什么还要提到这个?还有其他我没有考虑的选项吗?

0

你可以尝试使用UUID算法,原因如下:

  • 它不依赖于硬件
  • 它真正随机
  • 它是平台无关的。

但要注意:为了实现硬件独立性,您必须选择一些不使用机器的MAC地址的算法。微软的GUID使用它(这就是他们发现谁写了那个LOVE YOU病毒的方式,还记得吗?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接