怎样生成唯一的ID?
打开我的简书首页,在地址栏上可以看到这样的地址
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?相关推荐
- python namespace unique_Python使用uuid库生成唯一标识ID
uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identifier). ...
- js生成唯一标识ID
js生成唯一标识ID 前言 方法一.利用时间戳+随机字母生成 方法二.利用时间戳加上机器码生成的唯一标识ID 总结 前言 有时候,表格数据的分页,增加,删除,编辑等功能都需要前端来完成,因为数据的全部 ...
- 在高并发分布式情况下生成唯一标识id
做项目的时候经常会用id作为唯一标识. 但是当有这样一个需求出现的时候:工程分布式部署,要求抗住高并发.并且生成的id是根据时间自增的.解决这个问题有很多种方法,但是要选择一个性价比比较高的策略比较不 ...
- 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)
Twitter-SnowFlake算法的产生是源于Twitter为了满足自己业务(每秒上万条消息的请求,每条消息都必须分配一条唯一的id,并且在分布式系统中不同机器产生的id必须不同)的需求. sno ...
- 【高性能】生成唯一时间戳ID,1毫秒预计能生成1000个
凡事涉及到高性能貌似都是高大上的东西,所以嘛我也试试:其实这个时间戳ID的生成主要为了解决我们公司内部的券号生成,估计有小伙伴认为券号生成有这么麻烦嘛,搞个自增ID完全可以用起来,或者时间取毫微米时间 ...
- node生成唯一设备id(node-machine-id)
npm安装: npm install node-machine-id yarn安装: yarn add node-machine-id //有 异步,同步 两种生成方式 import {machine ...
- php给留言分配id_如何使用php生成唯一ID的4种方法
php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...
- java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法
SegmentFault 社区专栏:全栈修仙之路作者:semlinker No.1 Snowflake 简介 1.1 什么是 Snowflake Snowflake is a service used ...
- JavaScript 生成唯一ID的几种方式
这篇文章主要介绍了JavaScript 生成唯一ID的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下. 编程的世界里,在很多的时候,我们都需要一个唯一的ID来代表一些数 ...
最新文章
- POI简易帮助文档系列--给Excel设置样式
- 一加6升级android p,一加6手机升级安卓P攻略 教你怎么更新安卓P Beta版
- pyhon取文件md5值
- rpm 软件的安装和卸载
- 解决Dependency ‘xxxx‘ not found
- windows server 2008 r2 IIS PHP
- zabbix—自动发现端口并监控
- 无状态的HTTP协议
- html怎么给边框改样式,html里面怎么设置边框?html边框样式设置方法
- 【VMware vSAN 6.6】5.4.vSAN 配置提示:vSAN硬件服务器解决方案
- 性能测试adb常用命令
- 硬盘安装RedHat9.0心得(转)
- windows服务器双网卡链路聚合_服务器双网卡捆绑与交换机链路聚合排障1例
- EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)
- 国际高中成绩差但是想读名校怎么办(文末附自救指南)
- 软件工程知识点复习第二章
- 一度智信电商开网店怎么样?
- 【从0开始入门python】一个半月的三万字学习笔记汇总!!!
- 快问快答,MySQL面试夺命20问
- 自制Unity文件查找器,支持拼音搜索
热门文章
- 计算机网络安全倡议书,文明上网倡议书
- 市场分析:洞悉客户决策过程
- Python绘制地图时的色带Colormaps
- Nervos:为了更好的世界
- Python的自学之路:Python基础(一)
- poi导出excel,去掉左上角绿色三角
- 【shopify 1】调研出海项目,发现shopify没有java的相关SDK接口,但是找到一个最新2022年6月的Java项目分享了相关代码,使用docker进行环境搭建、编译,并成功启动
- STM32F103你学不会系列(十七)电容触摸按键实现
- 计算机许可管理器服务器名称是什么意思,服务器客户端访问许可是什么意思
- 树莓派学习笔记——定时向yeelink上传树莓派CPU温度