国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP如何生成唯一的數字ID
怪我咯
怪我咯 2017-04-10 16:34:33
0
17
2059

PHP如何生成唯一的數字ID,注意是數字的,不要字符串的

怪我咯
怪我咯

走同樣的路,發(fā)現不同的人生

reply all(17)
黃舟

樓主,你這個問題大了。

twitter,weibo等都是專門做了一個發(fā)號器來解決這個問題的。
twitter那一套東西,叫做snowflake,樓上已經有人指出過了。這玩意一共64bit,前41bit是以微妙的時間戳,10bit是機器護著說服務器id,最后12bit是seq序列累加計數器。
weibo的方法和twitter是很類似的,將id分割為n個段,每段采集一定的數據源,最后生成一個高度唯一的id。

flickr是用的一個叫做ticketserver的玩意,使用純mysql來實現的。
create table ticket(
id bigint unsigned not null auto_increment primary key,
stag char(1) not null default '',
unique key stag(stag)
)engine=myisam;
先插入一條記錄,然后再用replace去獲取這個id。
replace into ticket(stag) values('a');
select last_insert_id();====>ID

然后是,UUID也是一個不錯的選擇,但是UUID生成的序列太長,而且mysql本身不具備原生支持(我假裝樓主用的mysql),但樓主可以嘗試把uuid當作binary(16)來保存效果會好些兒。但樓主說是純數字,那就白搭了。

還有一種,是我群里聽到的。就是提前生成一大坨可用的唯一的id,用的時候直接取然后del掉,這也是可行的,因為說這個方案的那個人是個大神。為什么提前生成呢,我覺得最主要一條就是預防高并發(fā)情況下,兩個人得到的id是一樣 ; 提前生成的話可以排隊一個一個生成,確保唯一。當然,他們的生成策略是什么我就不太清楚了。樓主可以參考twitter的做法。

另有,mongodb自帶的objectId也是一種高度唯一的序列,樓主可以利用Mongodb生成的直接拿過來用,但也要確保高并發(fā)情況下,兩個人或者更多人得到同一個id,雖然概率很低。但樓主說是純數字,那還是白搭。

如果樓主玩的單機,那就不用太糾結唯一id的問題,主鍵自增就可以做唯一id。太長遠的問題,現在可以考慮,但不能過于拘泥。如果樓主是分布式,那就是要必須了要這個東西了。

小葫蘆
base_convert(uniqid(), 16, 10);

可以

小葫蘆

redis incr

巴扎黑

推薦一個 我自己在用的唯一數字ID生成器

https://github.com/sschiau/Particle.php

Particle

Language: PHP

64bits int Time Based ID Generator

PHP implementation of Twitter Snowflake ID Generator

Uncoordinated

For high availability within and across data centers, machines generating ids should not have to coordinate with each other.

Solution

  • PHP (tested on version 5.5.3)

  • id (64 bits) is composed of:

    • time - 41 bits (millisecond precision w/ a custom epoch)

    • configured machine id - 10 bits - up to 512 machines

    • sequence number - 12 bits - up to 2048 random numbers

System Clock Dependency

You should use NTP to keep your system clock accurate.

How to use it

Generate Particle ID

Change const EPOCH in particle class to today epoch time w/ miliseconds (13 digits)

    $machineID = 1; // Machine ID (aka Server ID no)
    
    Particle::generateParticle($machineID);

Time from Particle ID (w/ milisecond precision)

    $particleID = '4611692470816737853';
    
    Particle::timeFromParticle($particleID);
阿神

樓主應該說明唯一ID用途和使用場景,數據庫自增ID,還有PHP是弱類型的,數字和字符串數值類型是可以通用,相互轉換的.

左手右手慢動作

沒辦法的, 除非你記錄生成過的數字, 否則即使隨機函數,時間戳生成數字都會出現重復的。

PHPzhong

twitter全局唯一ID生成服務:snowflake(https://github.com/twitter/snowflake)
引用:
http://www.oschina.net/p/snowflake
http://www.cppblog.com/tx7do/archive/2014/06/10/207248.html

Peter_Zhu

uniqid is really good, why don't you use it ? just need convert to number , first answer is cool.

sorry I can't type Chinese, because it's disabled on chrome , I think it's a bug of segmentfault.com

劉奇

應該先說明場景,單機唯一還是多久唯一,單次請求唯一還是多次請求唯一

黃舟

時間戳加隨機數字的組合,但是保險起見,最好生成之后還是需要到記錄過的ID池驗證一下

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template