新浪微博和twitter 等系统都有一窜数字ID来标示一个唯一的用户,这篇文章就是记录如何实现这种唯一数字ID

原理:使用MYSQL 自增ID 拼接任意字符..然后使用进制转换打乱规则

一般来说实现唯一性可以使用uniqid 或者time之类的方式生成,但是考虑到多台系统,也就是分布式系统。这种方式就不准确了。

实现:

新建一个数据库:

CREATE TABLE `user_number_id` (
`id` bigint() unsigned NOT NULL auto_increment,
`stub` char() NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM

使用replace into 来取得生成的ID

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID() as number_id;

取得number_id后生成十位数字ID

function auID($autoID)
{
$autoID = $autoID;
$autoCharacter = array("","","","","","","","","","A","B","C","D","E");
$len = -((int)log10($autoID) + );
$i=;
$numberID = mt_rand(, ).mt_rand(, );
for($i;$i<=$len-;$i++)
{
$numberID .= $autoCharacter[mt_rand(, )];
} return base_convert($numberID."E".$autoID, , );
//--->这里因为autoid永远不可能为E所以使用E来分割保证不会重复
}

base_convert 转换16进制到10进制,只要16进制不同那么10进制就一定不同,因为10位十进制最大可取范围:9999999999转换成16进制是2540BE3FF所以前两位可取值是固定的mt_rand(1, 2).mt_rand(1, 4)

以下是测试用例表明没有重复(内存问题只测到55万):

static $array=array();
for($j=;$j<=;$j++)
{
$array[] = auID($j);
} print_r(count(array_unique($array))); function array_repeat($arr)
{
if(!is_array($arr)) return $arr; $arr1 = array_unique($arr); $arr3 = array_diff_key($arr,$arr1); return array_unique($arr3);
} print_r(array_repeat($array));

最后funition:

function auID()
{
$autoID = mt_rand(, );
$autoCharacter = array("","","","","","","","","","A","B","C","D","E");
$len = -((int)log10($autoID) + );
$i=;
$numberID = mt_rand(, ).mt_rand(, );
for($i;$i<=$len-;$i++)
{
$numberID .= $autoCharacter[mt_rand(, )];
}
return base_convert($numberID."E".$autoID, , ); //--->这里因为autoid永远不可能为E所以使用E来分割保证不会重复
} var_dump(auID());

考虑到可能会有主从需求,id生成应该去取同一个数据表的数据,或者设置好自增id,如主服务器1357,从服务器2468

参考:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

来源地址:http://ray-cheng.github.io/kss/php/2014/07/07/decade-user_id-strategy.html

十位用户唯一ID生成策略的更多相关文章

  1. 分布式全局唯一ID生成策略​

    一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. ...

  2. 分布式全局唯一ID生成策略

    为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...

  3. 常见分布式全局唯一ID生成策略

    全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...

  4. 常见分布式唯一ID生成策略

    方法一: 用数据库的 auto_increment 来生成 优点: 此方法使用数据库原有的功能,所以相对简单 能够保证唯一性 能够保证递增性 id 之间的步长是固定且可自定义的 缺点: 可用性难以保证 ...

  5. 可实现的全局唯一有序ID生成策略

    在博客园搜素全局唯一有序ID,罗列出来的文章大致讲述了以下几个问题,常见的生成全局唯一id的常见方法 :使用数据库自动增长序列实现 : 使用UUID实现:  使用redis实现: 使用Twitter的 ...

  6. JPA ID生成策略(转---)

    尊重原创:http://tendyming.iteye.com/blog/2024985 JPA ID生成策略 @Table Table用来定义entity主表的name,catalog,schema ...

  7. 融云技术分享:解密融云IM产品的聊天消息ID生成策略

    本文来自融云技术团队原创分享,原文发布于“融云全球互联网通信云”公众号,原题<如何实现分布式场景下唯一 ID 生成?>,即时通讯网收录时有部分改动. 1.引言 对于IM应用来说,消息ID( ...

  8. 分布式系统唯一ID生成方案汇总

    系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...

  9. 分布式系统的唯一id生成算法你了解吗?

    在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ...

随机推荐

  1. 外部jar包 @Service 无法注解无法扫描问题

    在确保spring 配置 无误的情况下,如: <context:component-scan base-package="your.can.pakeage"></ ...

  2. hive 添加UDF(user define function) hive的insert语句

    add JAR /home/hadoop/study/study2/utf.jar; package my.bigdata.udf; import org.apache.hadoop.hive.ql. ...

  3. strust2 和 hibernate的整合------登录的实现

    初步认识了struts2,并与hibernate进行整合,完成了一个登录的案例,下面贴源码 1.实体类User public class User { private Integer id; priv ...

  4. .net版本和操作系统

    转自: http://msdn.microsoft.com/zh-cn/library/bb822049(v=vs.110).aspx 服务器操作系统 包括 还可以安装 Windows Server ...

  5. Python 爬虫实战3 计算大学本学期绩点

    大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的 ...

  6. hdu 2460(tarjan求边双连通分量+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...

  7. 强大的find命令

    find命令确实很强大,自己懒得计,转载一篇: 原文出处:http://roclinux.cn/?p=18 1. 想查看当前文件夹及子文件夹里有没有文件名为“abc”的文件 # find . -nam ...

  8. Laravel5.1 模型--ModelFactory

    今天要说的是模型工厂,它是可以快速生成一些测试数据的东西,之前我们介绍过Seeder,当我们使用模型访问数据时 可以用模型工厂搭配Seeder使用. 1 编写一个ModelFactory ModelF ...

  9. CentOS7环境下在/离线安装GCC与GCC-C++

    前几天在准备CentOS7下的编译环境,在线安装GCC和GCC-C++非常简单,只要机器是联网的在Terminal窗口中按顺序分别输入 yum install gcc yum install gcc- ...

  10. EasyUI怎么利用onBeforeRender事件

    onBeforeRender事件是view的属性,该事件发生在把ajax请求到的数据填充到表格内容中之前 将此段代码附加在DataGrid初始化后执行,即可完成在DataGrid渲染之前进行操作 // ...