如何生成全局唯一标识
引出
大家都用过QQ或者微信吧, 当我们注册的时候, 会被自动分配一个QQ号, 这个号码是全局唯一且固定的, 那么, 如果是你来写的话, 如何为新注册的用户分配一个号码呢? 亦或是一个电商网站, 要为每个订单生成一个订单号? 再或是一个即时聊天, 要为每个消息生成一个消息ID?? 我简单想了想
方案一
其实这事说简单点, 不就是要为每个用户都配一个数字么? 而且这个数字必须是之前没有用过的. 那简单了, 数数就完了呗, 123456往下数, 来一个发一个记一个.
如何实现? MySQL主键自增, 或者redis记一个key, 每次incr
自增. 什么? QQ号从1开始太丑了? 简单, 自增设置一个起始ID.
完美, 实现方案简单粗暴, 而且不会出现重复.
方案二
使用时间戳. 使用当前时间戳来生成, 比如: 1585390459
这样的数字. 但是时间戳是以秒为单位的, 如果一秒发生了多次请求, 那不就重复了么? 我想了想, 有一个简单到爆的处理方法, 在后面再拼上0000
-9999
的随机数, 这样每秒有一万个不重复的, 重复的概率就降低了, 在生成后还需要查询是否已经存在, 若存在则重复生成.
方案三
说起来, 要生成这样的随机ID, 总要有一个地方来记录已生成的进度, 如果完全随机生成的话, 就不可避免的需要回查是否存在. 记录生成进度的可以有很多: redis、MySQL等等. 或者可以存在一个发号器, 所有的ID都有它来生成, 不停的生成, 供其他请求分配使用, 就是一个生产者消费者.
小结
通过想了几种方案, 发现了一些规律.
要想生成随机ID, 首先, 要有一个不是随机的而又是当前唯一持有的. 在这个前提下, 再各种添油加醋, 生成最终的ID. 就算你要调用随机函数, 也得设置一个随机种子不是? 莫非这就是传说中的以不变应万变…
很好, 那么现在问题就归结为, 如何给每个用户都配一个唯一标识
1.数数
直接想到的方案, 从1开始, 慢慢往后数, 而这个过程可以借助MySQL的主键自增, 也可以借助redis的单线程优势. 等等吧,
2.用户特征
可以根据不同用户的特征, 如用户的地域、性别、生辰等等, 来生成每个人的唯一标识, 此举可以参考身份证号码的生成, 每个人都是不一样的
3.当前机器特征
找到执行代码时的特定特征, 如: mac地址、时间戳、机器编号、线程ID等等
4.代码运行次数
线程共享变量, 每次执行则+1.
等等等等
简单想下来, 其实重要的是找到其中每次生成都和别人不一样的那个点, 然后拿来稍作加工即可. 有点找不同的赶脚. 对了, 在网上看到了twitter
的雪花算法, 基本也是找不同的思路. 关键就在于你是否能从各种功能繁杂的信息中找到那个不同的点. 如果实在找不到不同, 就只能人为的赋予他们不同了(自增ID等).
现在已经有很多工具了, uuid, MongoDB的objectid等, 基本可以拿来直接使用.
如何生成全局唯一标识相关推荐
- Android 10 + 适用于国内各大手机厂商的开放匿名设备标识(OAID),若不支持OAID则随机生成一个全局唯一标识(GUID)
源码见:https://github.com/gzu-liyujiang/Android_CN_OAID 本项目用于获取国内各大Android手机厂商的开放匿名设备标识(OAID).遵循谷歌官方使用A ...
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...
- 如何在分布式场景下生成全局唯一 ID ?
作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...
- 全局唯一递增的id_生成全局唯一id的几种方式
生成全局唯一id的几种方式: 1.uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高:缺点长度较长,没有递增趋势性,不易维护,常用于生成token令牌. 2.mysql自带自增 ...
- 高并发分布式系统中生成全局唯一Id汇总
全局唯一ID <高并发分布式系统中生成全局唯一Id汇总> Twitter 方案(Snowflake 算法):41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器 ...
- 如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...
- 高并发分布式系统中生成全局唯一订单号
高并发分布式系统中生成全局唯一订单号 我了解的方案如下-------------------------- 1. 使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题. 缺陷: 1) ...
- 高并发分布式系统中生成全局唯一(订单号)Id
2019独角兽企业重金招聘Python工程师标准>>> 高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的 ...
- sqlserver 中的GUID 全局唯一标识 -摘自网络
--简单实用全局唯一标识 DECLARE @myid uniqueidentifier SET @myid = NEWID() PRINT 'Value of @myid is: '+ CONVERT ...
最新文章
- mysql的模糊查询在xml_数据库模糊查询语句(mybatis中运用(xml文件))
- 在EXE和DLL中,FindResource的区别
- MySQL 安装报找不到MSVCR120.dll错误
- 机器人学习--Mobile robotics 国外大牛及实验室
- python获取输入法状态_Python学习中常见的错误
- Java中使用队列Queue
- 二分排序java实现
- C++面向对象高级编程(上) 第一周 侯捷
- phpstrom 安装
- 3.2 Zend_Db_Select
- 设计递归算法,删除不带头结点的单链表L中所有值为X的结点
- php字符串中删除字符串函数,PHP实现删除字符串中任何字符的函数
- 店宝宝:电商直播被“敲响警钟”了
- MATLAB表上作业法解决运输问题
- python爬虫之利用pyquery爬取当当网图书信息
- php 高德地图经纬度,高德地图php 换取经纬度 地址
- DataGear 制作自适应任意屏幕尺寸的数据可视化看板
- css中“~”(波浪号)、“,”(逗号)、“+”(加号)和“”(大于号)详解
- 拥抱数字化变革 |2021 全球产品经理大会亮点回顾
- 使用ngrok 二 -- 微信公众号笔记---本地调试微信接口
热门文章
- 跨模块中的分配内存问题
- 计算机专业性特有的道德要求,什么是通信科学技术人员职业道德的双重性?
- 解决:Linux中的CentOS 7的火狐浏览器不能访问服务器
- c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...
- linux播放到设备,linux - 将字节流式传输到ALSA播放设备 - 堆栈内存溢出
- oracle plsql 到处dbf_plsql 导出oracle数据库
- channelsftp 上传文件为空_SpringBoot文件上传下载篇(九)
- qt 将int型数据显示在文本框_Qt编写Online judge爬虫
- python鸡兔同笼编程运行结果_Python少儿编程:鸡兔同笼
- 华中师范大学本科生计算机课教师,华中师范大学第八届大学生计算机设计大赛的通知...