【问题标题】:How to generate an unique computer id on Delphi?如何在 Delphi 上生成唯一的计算机 ID?
【发布时间】:2024-01-14 09:24:01
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: delphi unique serial-number identification


    【解决方案1】:

    【讨论】:

    • 现在也在*上:链接腐烂。
    【解决方案2】:

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

    【讨论】:

    • 这里的问题是它不是特定于机器的,再次调用 Createguid 将创建一个不同的 id。我相信用户希望每次请求时都使用相同的 ID。
    • @skamradt 如果 GUID 已存在于注册表中的某个预定位置,则无需生成新的 - 因此 ID 将“每次都相同请求”。但是,通过使用硬件组件的序列号,ID 会在特定组件升级后立即更改。 OP 没有解释为什么需要这个 ID,但这种方法肯定会产生一些可以接受的东西,就 OP实际要求而言。
    【解决方案3】:

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

    选项 1

    位:

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

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

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

    选项 2

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

    选项 3

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

    选项 4

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

    【讨论】:

      【解决方案4】:

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

      • 独立于硬件
      • 真的很随机​​
      • 独立于平台。

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

      【讨论】:

        最近更新 更多