我正在创建一个论坛(只是为了测试),我已经达到了我同步线程列表和内部帖子的程度。我依靠mysql中的AUTO INCREMENT
来同步它们,但我知道它将来没用。
我现在的问题是,如何生成一个随机数字堆叠就像mysql auto_increment
一样?
查看主题列表时,它当前是
$sql = "SELECT * FROM threads WHERE th_unique='$section';
$result = mysqli_query($db,$sql);
然后我只需获取数据并输出列表中的线程。
基本上,在发送插入查询时,如何生成与自动增量相同的数字?
我知道rand()
但我最终没有发现它有效,因为它可能会重叠并使用已经存在的相同数字。
答案 0 :(得分:0)
实际上,您可以在某些条件下使用AUTO_INCREMENT with replication。
基于语句的AUTO_INCREMENT复制,LAST_INSERT_ID()和 TIMESTAMP值正确完成,具体如下 例外:
在MySQL 5.7.1之前使用基于语句的复制时, 从站表中的AUTO_INCREMENT列必须匹配相同的列 主人的专栏;也就是说,AUTO_INCREMENT列必须是 复制到AUTO_INCREMENT列。 ...
这个名单还在继续。如果您的情况是AUTO_INCREMENT不起作用的条件之一,UUID是一个选项。
另请看一下这个答案:https://stackoverflow.com/a/37605582/267540它适用于python / django这是翻译成PHP时的样子
define('START_TIME',1470825057000);
function make_id() {
/**
* inspired by http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
* Generates a unique identifier that isn't too complex and has a sequential nature (sort of)
*/
$t = microtime(True)*1000 - START_TIME;
$rnd = random_int(0,8388607);
return ($t << 23) | $rnd;
}
function reverse_id($id) {
$id = ($id >> 23) + START_TIME;
return $id;
}
for ($counter=0; $counter<100; $counter++) {
$id = make_id() ;
$time = reverse_id($id);
print "$id $time \n";
}
print 'Ending time ' . microtime(True)*1000;
正如您所看到的那样,数字看起来是连续的,但它们对于复制仍然是安全的。