你有过生成不重复编号的想法吗?比如做一个自动保存网页图片的工具,要保证保存的图片不互相覆盖,一个想法是使用一个计数器从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是什么。

Guid全局唯一性算法

下面以Lua为例实现guid的生成,再对比nginx服务器的MD5算法进行比对效率function guid()local seed = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}local sid = ""for i=1, 32 dosid = sid .. seed[math.random(1,36)]endreturn string.format('%s-%s-%s-%s-%s',string.sub(sid, 1, 8),string.sub(sid, 9, 12),string.sub(sid, 13, 16),string.sub(sid, 17, 20),string.sub(sid, 21, 32))
end
local s = 0
local start = socket.gettime()while s < 100000 dos=s+1--ngx.print(ngx.md5(math.random(1,36)) .. '\r\n')ngx.print(guid() .. '\r\n')
endngx.print("execute time:" .. socket.gettime()-start .. '\r\n')
ngx.exit(200)

代码

上面guid方法中seed读者可以自己自行扩展,比如再加入'A-Z'大写字符,guid我以32位的字符进行输出,

在实际测试过程中, 10万级的数据生成速度不考虑写文件的IO时间,远远低于0.4秒,而同等数量使用ngx.md5()时则足足多了一倍的时间;

再从唯一性上进行分析,10万级的生成串中,测试了10次,没有发现任何一次有重复的字符串,说明自配的guid算法足以满足实际生产使用;

唯一编号算法:生成GUID相关推荐

  1. 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...

    来源:http://t.cn/RG0AW0a 说明:本文代码采用C#,重要的是理解解决方案,代码实现都是次要的. 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成I ...

  2. SqlServer的NEWID()函数巧用,生成GUID作为唯一标识用

    场景 在进行开发过程中如果需要唯一标识的GUID(全局唯一标识符). 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符 ...

  3. 根据时间戳生成编号_使用雪花算法生成流水号!

    前言"在分布式系统中常见的问题就是如何生成流水号,一般情况下会有专门的流水号系统,不过在开发过程中或者开发早期不一定会有专门流水号系统,在这里介绍下我所使用的流水号生成器--雪花算法&quo ...

  4. java 唯一编号_Java秒杀系统实战系列~分布式唯一ID生成订单编号

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们 ...

  5. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

  6. 唯一ID(UniqueID)生成算法 解析

    目录 概述 一.UUID 二.Snowflake 源码 概述 唯一ID(UniqueID,UID)是系统设计常遇到的问题.生成唯一ID的方法有很多,例如常用的方式是利用数据库产生唯一ID,其优点的是无 ...

  7. 根据twitter的snowflake算法生成唯一ID

    C#版本 /// <summary>/// 根据twitter的snowflake算法生成唯一ID/// snowflake算法 64 位/// 0---0000000000 000000 ...

  8. 生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)

    一.在 .NET 中生成 1.直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛.GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台 ...

  9. thinkphp生成guid 唯一识别码

    thinkphp生成guid 唯一识别码 很多情况下需要生成唯一识别码,比如像商城订单.统一下单等 大家可以看看~ function guid() {if (function_exists('com_ ...

最新文章

  1. PHP (20140508)
  2. Flex 学习随笔 ---- 玩 Chart
  3. Cloudera将被私有化,Hadoop时代或将落幕
  4. putty连虚拟机中Linux出现Access Denied
  5. 面试官:简单说说Java8中的HashMap到底有啥变化?
  6. 微课|中学生可以这样学Python(例11.2):tkinter猜数游戏(2)
  7. 2.24小时365天不间断服务 --- 优化服务器及基础设施的拓扑结构(冗余,负载分流,高性能的实现)
  8. Html5 Canvas动画基础碰撞检测的实现
  9. 钢材规格解读的软件_《钢结构设计标准》解说专题(0)—钢结构的材料选择...
  10. 异构网络-元图、知识图谱
  11. open3d显示pcd点云并读取任意点的坐标+生成点云绕任意轴旋转的transformation matrix
  12. 零基础学python-2.24 一些常用函数
  13. webpack构建中tree shaking、scope Hoisting(面试题)
  14. [LeetCode]题解(python):155-Min Stack
  15. #搜索#(ssl 1758)连通图
  16. 我的一加5刷机基本步骤
  17. 游戏加盟和游戏代理有什么区别?哪个更好?
  18. 建成 5000 多间「梦想中心」后,他们决定将技术开源
  19. Linux将ip加入黑名单
  20. 百趣土壤非靶标代谢组学文献分享,来自Microbiome的灵感

热门文章

  1. 2020年,关于事件相机(event camera)的最新研究论文总结
  2. 迅为3399开发板Linux固件编译
  3. mysql javabean 工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版)...
  4. 零件测绘与计算机作图理论试题,2015年机械零部件测绘与制图技术赛项规程试题.doc...
  5. 晴天霹雳。。傲盾把我的Linux格成了03系统了?之二
  6. 蜜趣疑似机器人_寻找12名锦鲤,每人10000+元免单大礼!你吃喝玩乐,这家商场全包了...
  7. matlab绘制3维椭球,matlab拟合三维椭球
  8. 睡眠即醒 蓝牙_众人皆睡你独醒?Bose遮噪睡眠耳塞用黑科技助你酣睡!
  9. 【斜率优化】HDU-2993——MAX Average Problem
  10. 阿里巴巴“数据库侠客”:此行路远,不问归期