打开我的简书首页,在地址栏上可以看到这样的地址

http://www.jianshu.com/users/066ab87a062b/latest_articles

作为一个web开发者应该知道这里的users后面的那串"066ab87a062b"必定是我的ID,这个ID肯定是唯一的。这就是今天要讨论的,怎样生成唯一的ID?

如果你是一个初级的web开发者,那么你可能不会去生成这种唯一的ID,因为有一个很简单的方法已经帮我们搞定了这个事情,那就是数据库。

比如我们往数据库的用户表中插入一个用户,数据库的自增键就会生成一个唯一的ID,当然这种ID是很简单的,就是从1开始自增,这样就不会重复。当然这里有很大的安全隐患,从链接上多观察一下,就能发现规律。如果简书现在的链接是这样的:

http://www.jianshu.com/users/19875/latest_articles

再多看看其他用户的简书首页地址,你发现也是一个数字,并且修改几个连续的数字大多数能查看到其他用户,那么现在我就可以从ID为1开始遍历,就可以知道简书有多少注册用户了。是不是算暴露了信息?当然黑客可以做的事情远远不止这些。

这个时候我们就得想一个比较复杂的生成唯一ID的想法。

一般来说,我们都会想到用当前系统时间来做这件事情,比如最简单的是unix时间戳,像这样

time();
//1429874998

一般情况下这样是行不通的,因为unix时间戳只是精确到秒,同一秒有两个人注册怎么办?

我记得我一开始实习那会用这个方法来生成唯一ID

time() . rand(1, 10000);
//142987499812

时间戳后面加一个随机数,这样把一秒钟分成10000份,重复的概率只有万分之一,对于一般的情况已经能够搞定了。

但是精明一点的人肯能会猜到你是在用10位的时间戳加一个随机数字,那怎么办?

第一反映自然是加密:

md5(time() . rand(1, 10000));
//141464D2619764441D30A285ED4478F5

不可逆的加密算法有很多,比如md5,sha1等,当然如果使用可逆的加密算法容易被看出来。这样加密一般很难破解了,如果你还觉得不够安全,可以在加密前后进行一系列字符串操作,比如反转。这样就非常难以破解了。当然也有问题,那就是ID变得很长很长。而且似乎也没有解决生成唯一ID的关键问题。

生成唯一ID的关键问题就是唯一,安全问题次之,不是说安全不重要,而是如果连生成唯一ID都解决不了,安全就没有什么可谈的了,系统本身就是不稳定不安全的。

上述的方法还是有一定的概率生成重复ID的,虽然只有万分之一,但如果刚好两个人在同一秒注册,刚好就生成了一样的呢?

php提供了一个生成唯一ID的函数:

uniqid();
//553a2f5bad51f

这个生成的ID就和简书的ID非常像了。

但是这个函数也不一定会生成唯一的ID,原因是uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID;基于微妙的意思就是如果并发数非常非常高的时候,在同一个毫秒里面有两个人注册,那么也是会生成唯一的ID。

正真做到不重复要怎么办?

一种方法是结合时间和数据库生成的ID,这两者结合起来就是唯一的了。
至于怎么结合可以根据自己的需求或者喜好。这样生成的ID只要不进行不可逆加密还可以按时间来排序。

还有一种方法是不借助数据库那个唯一ID,而是将注册流程改为严格的单线程,也就是每次只处理一个,那这样时间戳就是唯一的了,生成方法也就可以随意发挥了。当然了,一两秒的等待用户还是可以接受的。

怎么做到严格的单线程处理注册流程?

第一种简单的就是假设你已经控制好了系统是单线程处理的,我记得以前听过一个鸵鸟算法,像鸵鸟一样将头埋在沙子里面,什么也不做,假装看不到,有时候这何尝不是一种好的生活态度呢。ok,继续说,假设以微妙为单位,这对于90%的系统已经能满足了,因为网站的量根本没有那么大。
第二种方法是用队列来处理,虽然牛刀杀鸡,但也算是个方法。

作者:龟仙老人
链接:https://www.jianshu.com/p/f4464631b82a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

怎样生成唯一的ID?相关推荐

  1. python namespace unique_Python使用uuid库生成唯一标识ID

    uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identifier). ...

  2. js生成唯一标识ID

    js生成唯一标识ID 前言 方法一.利用时间戳+随机字母生成 方法二.利用时间戳加上机器码生成的唯一标识ID 总结 前言 有时候,表格数据的分页,增加,删除,编辑等功能都需要前端来完成,因为数据的全部 ...

  3. 在高并发分布式情况下生成唯一标识id

    做项目的时候经常会用id作为唯一标识. 但是当有这样一个需求出现的时候:工程分布式部署,要求抗住高并发.并且生成的id是根据时间自增的.解决这个问题有很多种方法,但是要选择一个性价比比较高的策略比较不 ...

  4. 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)

    Twitter-SnowFlake算法的产生是源于Twitter为了满足自己业务(每秒上万条消息的请求,每条消息都必须分配一条唯一的id,并且在分布式系统中不同机器产生的id必须不同)的需求. sno ...

  5. 【高性能】生成唯一时间戳ID,1毫秒预计能生成1000个

    凡事涉及到高性能貌似都是高大上的东西,所以嘛我也试试:其实这个时间戳ID的生成主要为了解决我们公司内部的券号生成,估计有小伙伴认为券号生成有这么麻烦嘛,搞个自增ID完全可以用起来,或者时间取毫微米时间 ...

  6. node生成唯一设备id(node-machine-id)

    npm安装: npm install node-machine-id yarn安装: yarn add node-machine-id //有 异步,同步 两种生成方式 import {machine ...

  7. php给留言分配id_如何使用php生成唯一ID的4种方法

    php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...

  8. java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法

    SegmentFault 社区专栏:全栈修仙之路作者:semlinker No.1 Snowflake 简介 1.1 什么是 Snowflake Snowflake is a service used ...

  9. JavaScript 生成唯一ID的几种方式

    这篇文章主要介绍了JavaScript 生成唯一ID的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下. 编程的世界里,在很多的时候,我们都需要一个唯一的ID来代表一些数 ...

最新文章

  1. POI简易帮助文档系列--给Excel设置样式
  2. 一加6升级android p,一加6手机升级安卓P攻略 教你怎么更新安卓P Beta版
  3. pyhon取文件md5值
  4. rpm 软件的安装和卸载
  5. 解决Dependency ‘xxxx‘ not found
  6. windows server 2008 r2 IIS PHP
  7. zabbix—自动发现端口并监控
  8. 无状态的HTTP协议
  9. html怎么给边框改样式,html里面怎么设置边框?html边框样式设置方法
  10. 【VMware vSAN 6.6】5.4.vSAN 配置提示:vSAN硬件服务器解决方案
  11. 性能测试adb常用命令
  12. 硬盘安装RedHat9.0心得(转)
  13. windows服务器双网卡链路聚合_服务器双网卡捆绑与交换机链路聚合排障1例
  14. EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)
  15. 国际高中成绩差但是想读名校怎么办(文末附自救指南)
  16. 软件工程知识点复习第二章
  17. 一度智信电商开网店怎么样?
  18. 【从0开始入门python】一个半月的三万字学习笔记汇总!!!
  19. 快问快答,MySQL面试夺命20问
  20. 自制Unity文件查找器,支持拼音搜索

热门文章

  1. 计算机网络安全倡议书,文明上网倡议书
  2. 市场分析:洞悉客户决策过程
  3. Python绘制地图时的色带Colormaps
  4. Nervos:为了更好的世界
  5. Python的自学之路:Python基础(一)
  6. poi导出excel,去掉左上角绿色三角
  7. 【shopify 1】调研出海项目,发现shopify没有java的相关SDK接口,但是找到一个最新2022年6月的Java项目分享了相关代码,使用docker进行环境搭建、编译,并成功启动
  8. STM32F103你学不会系列(十七)电容触摸按键实现
  9. 计算机许可管理器服务器名称是什么意思,服务器客户端访问许可是什么意思
  10. 树莓派学习笔记——定时向yeelink上传树莓派CPU温度