唯一编号算法:生成GUID

来源:互联网 发布:结构设计优化 编辑:程序博客网 时间:2024/06/05 19:39

你有过生成不重复编号的想法吗?比如做一个自动保存网页图片的工具,要保证保存的图片不互相覆盖,一个想法是使用一个计数器从1开始递增,但是这样还有问题,比如我们无法保证磁盘中以前没有可能造成重复的图片文件。

那么就来看看GUID算法吧。
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。它使用网卡MAC、地址、纳秒级时间、芯片ID码和许多可能的数字,这样保证每次生成的GUID永远不会重复,无论是同一个计算机上还是不同的计算机。
GUID长什么样呢?
{C7B1AFCC-810E-46d0-8157-09FC488D4C71}
看起来挺古怪的吧。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
不用担心GUID的性能问题,因为它生成过程是采用MAC地址、机器时钟等计算的,没有并发问题,所以它一点都不比自增计数器的慢,有时候甚至更快。

讲了一大堆理论,在程序中怎么生成GUID呢?
非常简单,调用CoCreateGuid函数即可,它定义在objbase.h这个头文件中。
核心调用代码:

//--生成GUID
void generate_guid(TCHAR* guid_string)
{
 GUID guid;
 strcpy(guid_string,"");
 
 if( CoCreateGuid(&guid) == S_OK)
 {    
   _stprintf(guid_string, TEXT("{%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 ;
}

 

CoCreateGuid需要一个GUID结构体指针作为参数,GUID中有很多域,按照我给的方法把GUID打印成字符串即可。
GUID 可以用在很多的场合下,比如防止网站文章被小偷程序采集,比如一个查看文章的页面是 article.aspx?id=1,那么我可以写一个循环,就能够把所有的文章都采集过来。而如果使用GUID的话article.aspx?id=xxxx-xxxxxxxx-xxxx-xxxx,那么简单的循环就不行了,因为我无法预测下一个GUID是什么。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 反复发烧39度多怎么办 孩子不爱喝水怎么办%3f 8岁儿童不爱喝水怎么办 儿子14岁了不爱说话怎么办 我孩子长得老慢怎么办 老公嫌你烦了怎么办 2岁宝宝吃饭不嚼怎么办 2岁宝宝挑食厌食怎么办 孩子不爱和家长交流怎么办 孩子发烧在医院查不出病因怎么办 宝宝乳牙长歪了怎么办 两岁宝宝不爱吃水果怎么办 两岁宝宝不吃水果怎么办 一岁的宝宝上火了怎么办 吃水果嘴唇肿了怎么办 二岁宝宝不爱吃饭怎么办 小婴儿便秘但不爱喝水怎么办 宝宝只吃水果不吃饭怎么办 一岁宝宝不喜欢吃水果怎么办 1岁宝宝不吃水果怎么办 一岁半宝宝吃水果拉肚子怎么办 大人发烧了怎么办如何退烧 怀孕后不爱吃水果怎么办 不敢吃水果了怕虫怎么办 宝宝发烧38度不出汗怎么办 1岁宝宝喜欢含饭怎么办 3岁宝宝喜欢含饭怎么办 孩子咳嗽发烧怎么办最有效 孩子咳嗽打哈切流鼻涕发烧怎么办 孩子香蕉吃多了怎么办 80多岁老人发烧怎么办 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办 宝宝脖子被汗淹到红了脱皮怎么办? 小儿出汗多咳嗽怎么办吃什么 牛高烧不退怎么办最好 猪体温低不吃食怎么办 小孩发烧咳嗽怎么办吃什么药 大晚上发烧39度怎么办 胃受凉了老打嗝怎么办 大人发低烧怎么办如何退烧