引出

大家都用过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等, 基本可以拿来直接使用.

如何生成全局唯一标识相关推荐

  1. Android 10 + 适用于国内各大手机厂商的开放匿名设备标识(OAID),若不支持OAID则随机生成一个全局唯一标识(GUID)

    源码见:https://github.com/gzu-liyujiang/Android_CN_OAID 本项目用于获取国内各大Android手机厂商的开放匿名设备标识(OAID).遵循谷歌官方使用A ...

  2. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

  3. 如何在分布式场景下生成全局唯一 ID ?

    作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...

  4. 全局唯一递增的id_生成全局唯一id的几种方式

    生成全局唯一id的几种方式: 1.uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高:缺点长度较长,没有递增趋势性,不易维护,常用于生成token令牌. 2.mysql自带自增 ...

  5. 高并发分布式系统中生成全局唯一Id汇总

    全局唯一ID <高并发分布式系统中生成全局唯一Id汇总> Twitter 方案(Snowflake 算法):41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器 ...

  6. 如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  7. 高并发分布式系统中生成全局唯一订单号

    高并发分布式系统中生成全局唯一订单号 我了解的方案如下-------------------------- 1.  使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题. 缺陷: 1)    ...

  8. 高并发分布式系统中生成全局唯一(订单号)Id

    2019独角兽企业重金招聘Python工程师标准>>> 高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的 ...

  9. sqlserver 中的GUID 全局唯一标识 -摘自网络

    --简单实用全局唯一标识 DECLARE @myid uniqueidentifier SET @myid = NEWID() PRINT 'Value of @myid is: '+ CONVERT ...

最新文章

  1. mysql的模糊查询在xml_数据库模糊查询语句(mybatis中运用(xml文件))
  2. 在EXE和DLL中,FindResource的区别
  3. MySQL 安装报找不到MSVCR120.dll错误
  4. 机器人学习--Mobile robotics 国外大牛及实验室
  5. python获取输入法状态_Python学习中常见的错误
  6. Java中使用队列Queue
  7. 二分排序java实现
  8. C++面向对象高级编程(上) 第一周 侯捷
  9. phpstrom 安装
  10. 3.2 Zend_Db_Select
  11. 设计递归算法,删除不带头结点的单链表L中所有值为X的结点
  12. php字符串中删除字符串函数,PHP实现删除字符串中任何字符的函数
  13. 店宝宝:电商直播被“敲响警钟”了
  14. MATLAB表上作业法解决运输问题
  15. python爬虫之利用pyquery爬取当当网图书信息
  16. php 高德地图经纬度,高德地图php 换取经纬度 地址
  17. DataGear 制作自适应任意屏幕尺寸的数据可视化看板
  18. css中“~”(波浪号)、“,”(逗号)、“+”(加号)和“”(大于号)详解
  19. 拥抱数字化变革 |2021 全球产品经理大会亮点回顾
  20. 使用ngrok 二 -- 微信公众号笔记---本地调试微信接口

热门文章

  1. 跨模块中的分配内存问题
  2. 计算机专业性特有的道德要求,什么是通信科学技术人员职业道德的双重性?
  3. 解决:Linux中的CentOS 7的火狐浏览器不能访问服务器
  4. c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...
  5. linux播放到设备,linux - 将字节流式传输到ALSA播放设备 - 堆栈内存溢出
  6. oracle plsql 到处dbf_plsql 导出oracle数据库
  7. channelsftp 上传文件为空_SpringBoot文件上传下载篇(九)
  8. qt 将int型数据显示在文本框_Qt编写Online judge爬虫
  9. python鸡兔同笼编程运行结果_Python少儿编程:鸡兔同笼
  10. 华中师范大学本科生计算机课教师,华中师范大学第八届大学生计算机设计大赛的通知...