为mysql生成数字

时间:2016-08-10 09:35:56

标签: php mysql

我正在创建一个论坛(只是为了测试),我已经达到了我同步线程列表和内部帖子的程度。我依靠mysql中的AUTO INCREMENT来同步它们,但我知道它将来没用。

我现在的问题是,如何生成一个随机数字堆叠就像mysql auto_increment一样?

查看主题列表时,它当前是

$sql = "SELECT * FROM threads WHERE th_unique='$section'; $result = mysqli_query($db,$sql);

然后我只需获取数据并输出列表中的线程。

基本上,在发送插入查询时,如何生成与自动增量相同的数字?

我知道rand()但我最终没有发现它有效,因为它可能会重叠并使用已经存在的相同数字。

1 个答案:

答案 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;

正如您所看到的那样,数字看起来是连续的,但它们对于复制仍然是安全的。