如何生成全局唯一标识

引出

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GC算法的评价标准

GC是什么 GC就是垃圾回收, 哎, 现在Java如日中天, JVM都又算了解吧. 其中的垃圾回收还经常在面试中问道(虽然我忘完了). 当然, 垃圾回收不只是JVM, Python、等等高级语言都用到了. 简单说, GC完成的任务就两件事: 找到内存中已经无用的垃圾将垃圾回收, 以便于之后可以再次利用…

GC算法-标记清除算法

概述 标记清除算法, 描述起来很简单, 从名字上就能看出, 分为两个阶段: 标记阶段: 遍历所有对象, 将活动对象都打上标记清除阶段: 遍历堆, 将没有标记的对象释放掉. 介绍完毕, 本文结束. 开玩笑, 确实看上去很简单啦. 那就具体思考一下实现吧. 实现 介绍写的很清楚了, 实现…

GC算法-引用计数法

概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对象: 新建一个对象(对这个新的对象引用数量1)更新指针: 将一个指向A对象的…

GC算法-复制算法

概述 复制算法就是将内存空间二等分, 每次只使用其中一块. 当执行GC时, 讲A部分的所有活动对象集体移到B中, 就可以讲A全部释放. 画个图就是: ​ 在执行GC前, 内存长这样: ​ 当执行GC后, 内存就变成这样了: 还记得标记清除算法的问题是什么吗? 内存碎片化严重. 现在好了, …

GC算法-标记压缩算法

概述 还记得标记清除和复制算法的问题么? 堆使用效率低和碎片化问题. 那么有没有能够利用整个堆, 有没有内存碎片化问题的算法呢? 这就是标记压缩算法了. 简单来说, 标记压缩算法就是将堆中的所有活动对象整体向左移, 将对象间的空隙消除. 在GC执行前的内存: GC执行后的内…

GC算法-分代垃圾回收

概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. 经验表明, 大部分对象在生成后马上就成了垃圾. 也就是说, 年轻人要多运动, 没…

GC算法-增量式垃圾回收

概述 增量式垃圾回收也并不是一个新的回收算法, 而是结合之前算法的一种新的思路. 之前说的各种垃圾回收, 都需要暂停程序, 执行GC, 这就导致在GC执行期间, 程序得不到执行. 因此出现了增量式垃圾回收, 它并不会等GC执行完, 才将控制权交回程序, 而是一步一步执行, 跑一点, 再…

不知道写的是啥

刚才起夜, 被黑暗的环境吓到了. 当时有一种四面八方无数双眼睛在看着你, 又好像有什么会突然出现, 然后我赶紧打开灯, 这种感觉立刻烟消云散了, 好像根本没有来过一样. 很显然, 消除这种恐惧感的, 是光. 有没有光对我来说有什么区别呢? 视觉, 有光后, 能够看到周围的环境, 又…

IO多路复用小故事

背景故事 小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲. 这天, 小王躺在床上想, 既然这个邮局这么好, 咱何不从中分一杯羹呢? 但是现在人家邮局基…

PHP usort 函数底层排序

引出 最近在一个项目中, 需要对一个数组的顺序进行调整, 允许手动将某一个元素提到数组的开头位置. 在这里, 使用了PHP中的usort函数进行了数组的排序, 代码大致如下: usort($arr, function ($a, $b){// 这里添加了 order 字段, 默认为0, 将order大的提到前边return $b[order…

mac docker搭建开发环境

前言 刚买了一个mac本, 决定搭建一个纯docker的开发环境, 说到做到, 开始踩坑. 搭建 在搭建环境的过程中, 经历了很多错误, 例如为了令两个docker环境可以互通(如: nginx和php-fpm), 尝试了 link, network等等等等方式. 最后发现, 如果想实现两个docker环境的互通, 可以通过…

密钥交换算法: 迪菲-赫尔曼算法

概述 迪菲-赫尔曼算法用于通信双方交换密钥. 还记得之前介绍HTTPS协议的时候, 提到需要先通过对方公钥来进行密钥的交换, 然后再通过密钥对通信内容进行加密. 迪菲-赫尔曼算法就是用于交换密钥的. . 此算法与非对称加密算法不同哦. OK, 一起来看看吧. 引入 在正式介绍迪菲-…

纠错码简介

纠错码是个什么东西 引出 网络中的通信基于TCP和UDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个, 比…

计算机全加器简单实现

概述 用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢? 你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂. …

天天看底层有什么用

疑问 其实之前我一直有个疑问, 每天工作在应用层, 就算知道 TCP 的传包, 包的校验等等, 在工作中其实是用不到的, 每天看这些东西用什么用呢? 其一, 对工作的内容其实是起不到任何作用的, 其二, 浪费的时间如果将其用在工作上是可以产出更多效益的. 那么, 带给我的到底是什么…

求最大连续子集

问题 前两天看到一道算法题, 想了几天, 然后到网上搜了搜, 基本和我想到的相契合. 来, 题目如下: 给出一个数组, 求出和最大的连续子集. 举个例子: 数组 [1, 2, 3, 4, 5] 那和最大的就是数组本身了. 但是, 如果中间出现负数, 那情况立刻就不一样了, 你需要考虑是否能够将负数…

数据压缩算法

概述 之前在听到数据压缩的时候, 想着肯定是某些高深莫测的算法, 能够完成数据的压缩这种事情, 最近看了看, 嗯, 至少咱还是能看懂的. 无损压缩 众所周知, 不管你是exe, word, txt, dmg等等, 在存储上都是以二进制进行存储的, 所以, 在讨论压缩时, 忽略文件格式即可, 只要将…

何为真何为假

还记得第一个提出日心说的人是谁么? 没错, 哥白尼. 但是在那个年代, 所有人都认为太阳围绕着地球转的年代. 哥白尼的发现打破了大家的常识, 甚至于有过了很多年, 日心说才逐渐被大众所接受. 即使到了现在, 生活中仍然留有地心说的影子, 比如"日出" “日落” 等等, 就…

TCP 三次握手的意义

概述 在网络的传输层协议中, 存在着两大悍将: TCP 和 UDP . 从前, 我傻傻的以为自己对他们虽谈不上精通, 但还是知道的, 但是, 我错了, 我被自己问住了, 我傻了. 啥也不是. UDP (这里为了介绍简单, 就不提数据在传输过程中的失真(纠错码)等情况了. 简单介绍一下, TCP才是今天…

随机数是如何生成的

引出 在现实中, 会有抛硬币猜正反的操作, 硬币要么是正, 要么是反, 在揭晓之前, 我们谁也不知道它现在的状态. 而这, 是因为其中存在着很大的不确定因素, 如抛硬币的力度、抛硬币的角度、接硬币的力度和角度、硬币的重量、当前风速等等. 但是在计算机中, 要想生成一个随机数,…