6

如何快速为 delphi 应用程序生成唯一的计算机 ID?我以前用 c# 很容易做到这一点,但有时会失败。我确实希望 ID 是“静态的”,但我不在乎 ID 是否因硬件更改或操作系统重新安装而更改,我打算将其存储在注册表中并在应用程序启动时检查它,如果它改变了更新注册表。(我知道如何编写注册表部分,我只需要唯一 ID 的帮助)。

谢谢。

4

4 回答 4

6

使用硬盘序列号或MAC地址:

https://stackoverflow.com/questions/331106/how-to-get-serial-number-from-hard-disks(死链接)
生成唯一的机器ID

于 2009-12-06T02:44:47.847 回答
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;

高温高压

于 2009-12-05T16:44:25.790 回答
2

我不确定你在问什么?如果您澄清了为什么需要“唯一计算机 ID”,这可能会有所帮助。

选项1

位:

“我打算将它存储在注册表中,并在应用程序启动时检查它,如果它改变了更新注册表。”

给我的印象是您正在尝试检测应用程序的不同(较新)版本和/或识别套件中的不同应用程序。

如果是这种情况,那么只需按下即可Ctrl+Shift+G为您生成一个唯一的 GUID,并将其插入代码中的当前光标位置。您可能还想查看版本信息;也许自动增加内部版本号?

选项 2

如果您试图以某种方式识别不同计算机上的唯一安装,请查看CreateGUIDplainth 答案中的功能。

选项 3

您提到您“不在乎 id 是否因硬件更改或操作系统重新安装而更改”。我不确定这是否是一个重要的事实,例如:您正在尝试检测硬件更改?毕竟,你确实说过你不在乎;但是为什么要提这个呢?

选项 4

还有什么我没有考虑过的?

于 2009-12-05T18:36:21.167 回答
0

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

  • 它独立于硬件
  • 真的很随意
  • 它独立于平台。

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

于 2009-12-05T12:57:53.433 回答