Loading
2

用AutoHotKey语言实现与生成全球唯一标识符

全球唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。
在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如注册表项、类及接口标识、数据库、系统目录等对象。
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个4位十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
各种语言来生成的方法
VB
Option Explicit
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(8) As Byte
End Type
Private Declare Function CoCreateGuid Lib "ole32.dll" (pguid As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As Any, ByVal lpstrClsId As Long, ByVal cbMax As Long) As Long
Private Function GUIDGen() As String '生成GUID
Dim uGUID As GUID
Dim sGUID As String
Dim bGUID() As Byte
Dim lLen As Long
Dim RetVal As Long
lLen = 40
bGUID = String(lLen, 0)
CoCreateGuid uGUID '把结构转换为一个可显示的字符串
RetVal = StringFromGUID2(uGUID, VarPtr(bGUID(0)), lLen)
sGUID = bGUID
If (Asc(Mid$(sGUID, RetVal, 1)) = 0) Then RetVal = RetVal - 1
GUIDGen = Left$(sGUID, RetVal)
End Function

C++

#include <objbase.h>
#include <stdio.h>
//--生成GUID
const char* newGUID()
{
static char buf[64] = {0};
GUID guid;
if (S_OK == ::CoCreateGuid(&guid))
{
_snprintf(buf, sizeof(buf)
, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0], guid.Data4[1]
, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
, guid.Data4[6], guid.Data4[7]
);
}
return (const char*)buf;
}
int main(int argc, char* argv[])
{
//--COM
CoInitialize(NULL);
printf(newGUID());
printf("\n");
//--COM
CoUninitialize();
return 0;
}

Delphi

uses ActiveX;
function ctGUID:string;
var
id:TGUID;
begin
CoCreateGuid(id);
Result:=GUIDToString(id);
end;

C#

using System;
namespace GUID测试 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            //产生一个新的GUID并输出
            Console.WriteLine(System.Guid.NewGuid()); 
            Console.ReadKey(); 
        } 
     } 
 }

java

import java.util.UUID;
public class guid {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UUID uuid = UUID.randomUUID();
System.out.println(".{"+uuid.toString()+"}");
}
}

Pascal

Function Guid_Gen:ansistring;
Var
    s:string;
    i:longint;
Begin
    s:='0123456789abcdef';
    //8-4-4-4-12
    Guid_Gen:='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
    for i:=1 to length(Guid_Gen) do begin
        if Guid_Gen[i]='x' then Guid_Gen[i]:=s[Random(16)+1];
    end;
End;

易语言

.版本 2
 
.DLL命令 CoCreateGuid, , "ole32", "CoCreateGuid"
    .参数 guid, 字节集
 
.版本 2
 
.子程序 生成新的GUID, 文本型
.局部变量 guid, 字节集
.局部变量 a, 长整数型
.局部变量 b, 整数型
.局部变量 c, 整数型
.局部变量 s, 文本型
.局部变量 i, 整数型
 
guid = 取空白字节集 (16)
CoCreateGuid (guid)
a = 取字节集数据 (取字节集左边 (guid, 4), #长整数型, )
b = 取字节集数据 (取字节集中间 (guid, 5, 2), #整数型, )
c = 取字节集数据 (取字节集中间 (guid, 7, 2), #整数型, )
s = “”
s = s + 取文本右边 (“00000000” + 取十六进制文本 (a), 8) + “-”
s = s + 取文本右边 (“0000” + 取十六进制文本 (b), 4) + “-”
s = s + 到小写 (取文本右边 (“0000” + 取十六进制文本 (c), 4)) + “-”  ' 第三部分中的字母为小写字母
.计次循环首 (8, i)
    s = s + 取文本右边 (“00” + 取十六进制文本 (guid [i + 8]), 2)
    .如果真 (i = 2)
        s = s + “-”
    .如果真结束
 
.计次循环尾 ()
返回 (“{” + s + “}”)

PHP

public function create_guid(){ 
    $charid = strtoupper(md5(uniqid(mt_rand(), true))); 
    $hyphen = chr(45);// "-"
    $uuid = substr($charid, 6, 2).substr($charid, 4, 2).
    substr($charid, 2, 2).substr($charid, 0, 2).$hyphen 
    .substr($charid, 10, 2).substr($charid, 8, 2).$hyphen 
    .substr($charid,14, 2).substr($charid,12, 2).$hyphen 
    .substr($charid,16, 4).$hyphen .substr($charid,20,12);
    return $uuid;
    }

ExcelVBA

Function GetGuidToString() As String
    GetGuidToString = LCase(Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36))
End Function

这么多语言了,为啥没有AHK的呢,马上就有了下面就有了!

CreateGUID()
{
    VarSetCapacity(pguid, 16, 0)
    if !(DllCall("ole32.dll\CoCreateGuid", "ptr", &pguid)) {
        size := VarSetCapacity(sguid, (38 << !!A_IsUnicode) + 1, 0)
        if (DllCall("ole32.dll\StringFromGUID2", "ptr", &pguid, "ptr", &sguid, "int", size))
            return StrGet(&sguid)
    }
    return ""
}

下面给出使用方法

MsgBox % CreateGUID()    ; ==> {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

给出GUID比较函数

IsEqualGUID(guid1, guid2)
{
    return DllCall("ole32\IsEqualGUID", "ptr", &guid1, "ptr", &guid2)
}

上述函数的应用示例

GUID_1 := CreateGUID()
GUID_2 := CreateGUID()

MsgBox % IsEqualGUID(GUID_1, GUID_2)    ; ==> 0
MsgBox % IsEqualGUID(GUID_1, GUID_1)    ; ==> 1

 

本文为原创文章,未经同意禁止转载!!