• GUID

    (全局唯一标识符)

全局唯一标识符(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,Globally Unique Identifier

  • 类    型

  • 数字标识符

  • 作用于

  • 多节点、多计算机的网络或系统

格式

GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个4位十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。

特点

编辑

★需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理。

★GUID理论上能产生全球唯一的值,对于以后的数据导入很方便。

争议

由于GUID值产生的潜在弊端已经引起了保密性提倡者的关注。1999年3月,美国联邦商务委员会接到要求,对微软的GUID值使用进行调查。争议主要涉及Office 97和Office 2000文档对GUID值的使用。Office文档,如Word文件或Excel电子数据表,所使用的GUID值对用户是不可见的。但有很多报道宣称,文档的作者是可以通过GUID值的跟踪查到的,即使作者已经采用特殊方法,他们还是可以被追踪到。 为了回应上述问题,微软已经发布了一个Office 97修补版SR2,它禁止了GUID功能的使用,并且还可以将现存文档的GUID去除。

潜在的对Intel处理器序列号滥用的问题与上述GUID值的问题本质是一样的。

程序:

VB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 LongByVal cbMax As LongAs 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++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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

1
2
3
4
5
6
7
8
uses  ActiveX;
function  ctGUID: string ;
var
id:TGUID;
begin
CoCreateGuid(id);
Result:=GUIDToString(id);
end ;

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
using  System;
namespace  GUID测试 
{ 
     class  Program 
     { 
         static  void  Main( string [] args) 
         { 
             //产生一个新的GUID并输出
             Console.WriteLine(System.Guid.NewGuid()); 
             Console.ReadKey(); 
         } 
      } 
  }

Java

1
2
3
4
5
6
7
8
9
10
11
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()+ "}" );
}
}

OC

NSString * get_uuid()

{

CFUUIDRef uuid_ref = CFUUIDCreate(NULL);

CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);

CFRelease(uuid_ref);

NSString *uuid = [NSStringstringWithString:(NSString*)uuid_string_ref];

CFRelease(uuid_string_ref);

return uuid;

}

Pascal

【注:貌似上面的Delphi无法在free pascal下使用】

1
2
3
4
5
6
7
8
9
10
11
12
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 ;

易语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.版本 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

1

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; }

Excel VBA

1
2
3
Function  GetGuidToString()  As  String

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

End  Function


**********************************************




  • GUID

    (磁盘分区表方案)

    编辑

本词条缺少信息栏名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!

磁盘分区表方案

全局唯一标识分区表是一个实体硬盘的分区表的结构布局的标准。

先说说目前广泛使用的磁盘分区表方案。传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节,这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有64个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。

MBR分区方案不是用得好好的吗?为什么要提出新的方案呢?那就让我们看看MBR分区方案有什么问题。前面已经提到了主分区数目不能超过4个的限制,这是其一,很多时候,4个主分区并不能满足需要。另外最关键的是MBR分区方案无法支持超过2TB容量的磁盘。因为这一方案用4个字节存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算,每个分区最大不能超过2TB。磁盘容量超过2TB以后,分区的起始位置也就无法表示了。在硬盘容量的突飞猛进,2TB的限制已经被突破。由此可见,MBR分区方案已经无法满足需要了。下面介绍GUID分区表方案。

GUID分区表(简称GPT。使用GUID分区表的磁盘称为GPT磁盘)是源自EFI标准的一种较新的磁盘分区表结构的标准。与目前普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:
  1、支持2TB以上的大硬盘。
  2、每个磁盘的分区个数几乎没有限制。为什么说“几乎”呢?是因为Windows系统最多只允许划分128个分区。不过也完全够用了。
  3、分区大小几乎没有限制。又是一个“几乎”。因为它用64位的整数表示扇区号,即0 ~

=18,446,744,073,709,551,616。夸张一点说,一个64位整数能代表的分区大小已经是个“天文数字”了,若干年内你都无法见到这样大小的硬盘,更不用说分区了。
  4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表。其中一份被破坏后,可以通过另一份恢复。
  5、每个分区可以有一个名称(不同于卷标)。

既然GUID分区方案具有如此多的优点,在分区时是不是可以全部采用这种方案呢?不是的。并不是所有的Windows系统都支持这种分区方案。 请看下表:

Windows种类

能否读写GPT磁盘

能否从GPT磁盘启动

32位 Windows XP

不能。只能看到一个Protective MBR分区

不支持

Windows 2000/NT/9x

不能。只能看到一个Protective MBR分区

不支持

64位 Windows XP

只有基于Itanium的系统才能从GPT磁盘启动

Windows Server 2003 SP1及以上版本

只有基于Itanium的系统才能从GPT磁盘启动

Windows Vista

只有基于 EFI 的系统支持从GPT磁盘启动

Windows Server 2008

只有基于 EFI 的系统支持从GPT磁盘启动

Windows 7

只有基于 EFI 的系统支持从GPT磁盘启动

Windows 8/8.1只有基于 EFI 的系统支持从GPT磁盘启动
  

是不是很失望?目前多数的个人电脑系统还无法完美支持GPT磁盘。但是这并不意味着我们不需要了解GUID分区方案。别忘了,硬件的发展速度总是令人吃惊的。1.5TB的硬盘已经大量上市,2TB以上容量的硬盘很快就会普及,基于EFI的主板也正在销售。GUID分区方案终将成为主流 。

做为一款分区软件,DiskGenius从3.1版本开始支持GUID分区表。这是国内第一款支持GUID分区表的分区软件。DiskGenius提供了GUID分区的建立、删除、格式化、已丢失分区恢复、文件恢复、分区表备份、GUID分区表格式与MBR分区表格式之间的相互转换(无损转换)等功能。






备注:摘自http://baike.baidu.com/subview/185358/15334085.htm#viewPageContent