新浪微博和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

最新文章

  1. PHP中spl_autoload_register()函数的用法
  2. C# WebBrowser 网页缩放的方法
  3. PHP标准注释
  4. c# 框架学习(nop )总结-------删除功能
  5. 充实你的素材库!10款免费的 PSD 素材下载
  6. hihoCoder太阁最新面经算法竞赛17
  7. android NDk环境编译总结
  8. dispatch_async &amp; dispatch_sync
  9. (转载)PureMVC 练习时的注意事项
  10. JavaScript 【跨浏览器处理XML,做个兼容】
  11. Codeforces 487C. Prefix Product Sequence 逆+结构体
  12. Anaconda入门安装教程
  13. UGUI之用ScrollRect做下拉刷新
  14. 学以致用二十三-----shell脚本里调用脚本
  15. 通过本地yum源安装软件报错[Errno 14] PYCURL ERROR 56 - &quot;Failure when receiving data from the peer&quot;
  16. mysql之 slow log 慢查询日志
  17. js_字符转Unicode
  18. Delphi: TMethod转普通方法为对象方法
  19. Android 在测试阶段当出现多个测试服务器地址时打包的小技巧
  20. delphi 实现文件上传下载

热门文章

  1. char *strrchr使用
  2. ListView中pointToPosition()方法使用具体演示样例
  3. PHP 几种 序列化/反序列化的方法
  4. (转 )【Android那些高逼格的写法】InvocationHandler与代理模式
  5. 【转】支付宝WAP支付接口开发
  6. 第一百六十九节,jQuery,基础事件
  7. 结果集(ResultSet)用法
  8. jQuery EasyUI编辑DataGrid用combobox实现多级联动
  9. day23面向对象第一篇
  10. ubuntu 16.04 系统语言汉化