前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何生成全局唯一标识

如何生成全局唯一标识

作者头像
烟草的香味
发布2020-04-08 11:49:45
1.6K0
发布2020-04-08 11:49:45
举报
文章被收录于专栏:烟草的香味烟草的香味

引出

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 方案一
  • 方案二
  • 方案三
  • 小结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档