GUID---and---UUID---and---LUID

来源:互联网 发布:windows ctypes 编辑:程序博客网 时间:2024/04/20 16:52

GUID

在 API 参数中,需要给出的往往不是类或者 DLL/EXE 文件的真是名称,而是使用他们的 GUID(全局统一ID)。GUID 是微软对 UUID(统一唯一标识)的解释,理论上在整个空间和时间维上是唯一的,因此使用 GUID 来代替真实名称,可以防止系统中有两个相同名称的对象而造成混淆。
      一个 GUID 是一个128位长(16字节)的数,形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。其中前4字节为随机数;5-8字节为时间戳,记录了从1490年开始到该GUID的生成时间(低16位字在前,以分钟为单位),从而保证了时间上的唯一;9-10字节与机器重启次数有关;最后6字节一般为该机器的网卡地址(如果这台机器没有网卡,则使用另一常数),从而保证了空间上的唯一。
      在系统中,GUID 保存在注册表的 HKEY_CLASSES_ROOT 项下。HKEY_CLASSES_ROOT 其实是 HKEY_LOCAL_MACHINE/SOFTWARE/CLASSES/ 的快捷键,里面有很多长长的字串命名的子项,这些字串就是 GUID。在 HKEY_CLASSES_ROOT 下的 GUID 又分为4部分:
程序ID:
      如 Access.Application 等,其中 Access 表示类所在 DLL/EXE 文件名,Application 是类的名称。虽然程序ID较类ID易用,但因为它并不一定是唯一的,因此可能造成混乱。在 VB 和 VJ++ 中程序员只能使用程序ID,不过这两种语言允许程序ID长达39个字符,因此完全可以取一个与 GUID 完全相同的程序ID,从而保证程序ID也是唯一的。
CLSID:
      在这个子键下列出了在机器上注册过的所有类ID。在每个GUID键下。可以找到所有关于这个类ID的信息。如果该类ID对应一个DLL,则DLL文件名在 InprocServer32 子键下;如果是本地的一个EXE程序,则文件名在 LocalServer32 子键下;如果是远程EXE,则有一个 AppID 子键指向 AppID 键的入口。
AppID:
      在这个子键下列出了每个远程 DLL/EXE 的启动参数,包括对象位置、文件名等。
Interface:
      在这个子键下列出了本地系统中所有注册过的类的 GUID。在其中每个 GUID 键下,都保存着代理的类ID,当其他应用程序要与它通信时就使用这个ID传入传出参数


LUID
  LUID就是指locally unique identifier,我想GUID大家是比较熟悉的,和GUID的要求保证全局唯一不同,LUID只要保证局部唯一,就是指在系统的每一次运行期间保证是唯一的就可以了。另外和GUID相同的一点,LUID也是一个64位的值,相信大家都看过GUID那一大串的值,我们要怎么样才能知道一个权限对应的LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:
  BOOL LookupPrivilegevalue(
  LPCTSTR lpSystemName, // system name
  LPCTSTR lpName, // privilege name
  PLUID lpLuid // locally unique identifier
  );
  第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。在Winnt.h中还定义了一些权限名称的宏,如:
  #define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
  #define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
  #define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
  #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")

UUID
  UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。
  UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
  是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
  UUID由以下几部分的组合:
  (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
  (2)时钟序列
  (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
  UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。
  使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。
  通用惟一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球惟一标识符(GUID),这也是通用惟一标识符的一种类型,可用来指向组建对象模块对象和其他的软件组件。第一个通用惟一标识符是在网罗计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件

原创粉丝点击