How to generate an unique computer id on Delphi?

后端 未结 4 1270
清酒与你
清酒与你 2020-12-09 13:42

How can I quickly generate an unique computer id for a delphi app? I used to do it easly with c#, but this failed sometimes. I do want the ID to be \"static\" but I don\'t c

相关标签:
4条回答
  • 2020-12-09 14:06

    Use the hard disk serial number or MAC address:

    https://stackoverflow.com/questions/331106/how-to-get-serial-number-from-hard-disks (dead link)
    Generating a unique machine id

    0 讨论(0)
  • 2020-12-09 14:07

    Have a look at SysUtils.CreateGUID which creates a globally unique identifier. Syntax:

    function CreateGUID(out Guid: TGUID): HResult; stdcall;
    

    A small example taken from D2010's help:

    {
    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

    0 讨论(0)
  • 2020-12-09 14:15

    I'm not exactly sure what you're asking? It might help if you clarified why you need the "unique computer id".

    Option 1

    The bit:

    "I was planning to store it in the registry and check it when the app starts, and if it changed update the registry."

    gives me the impression you're trying to detect a different (newer) version of the app and/or identify different apps within a suite.

    If this is the case, then simply pressing Ctrl+Shift+G will generate a unique GUID for you and insert it at your current cursor position in code. You may want to also look at the version information; perhaps auto-increment build numbers?

    Option 2

    If you're trying to in some way identify unique installations on different computers, take a look at the CreateGUID function in plainth's answer.

    Option 3

    You mentioned that you "don't care if the id changes because of a hardware change or OS reinstallation". I'm not sure if this is an important fact like: you're trying to detect hardware changes? After all, you did say you don't care; but then why mention this at all?

    Option 4

    Something else I haven't considered?

    0 讨论(0)
  • 2020-12-09 14:20

    You may try using an UUID algorithm for the following reasons:

    • It independs hardware
    • It`s really random
    • It is platform independent.

    But watch out: to achieve hardware independence, you must choose some algorithm which does not use the MAC address of the machine. Microsoft`s GUID uses it (this was how they discovered who wrote that LOVE YOU virus, remember it?)

    0 讨论(0)
提交回复
热议问题