Php 为mysql生成数字

Php 为mysql生成数字,php,mysql,Php,Mysql,我正在创建一个论坛,只是为了测试,我已经达到了同步线程列表和帖子的地步。我一直依赖mysql中的自动增量来同步它们,但我知道它在将来不会有用 我现在的问题是,如何像mysql自动增量一样生成随机数堆叠 要查看线程列表,当前 $sql=从线程中选择*,其中THU unique='$section'; $result=mysqli_query$db,$sql 然后我只是获取数据并输出列表中的线程 基本上,当发送插入查询时,如何生成一个类似于自动递增的数字 我知道rand,但我觉得它最终没有效果,因为

我正在创建一个论坛,只是为了测试,我已经达到了同步线程列表和帖子的地步。我一直依赖mysql中的自动增量来同步它们,但我知道它在将来不会有用

我现在的问题是,如何像mysql自动增量一样生成随机数堆叠

要查看线程列表,当前

$sql=从线程中选择*,其中THU unique='$section'; $result=mysqli_query$db,$sql

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

基本上,当发送插入查询时,如何生成一个类似于自动递增的数字

我知道rand,但我觉得它最终没有效果,因为它可能会重叠,并使用已经存在的相同号码。

实际上,在某些条件下,您可以使用

基于语句的自动增量、上次插入ID和 时间戳值是否正确,取决于以下内容 例外情况:

在使用MySQL 5.7.1之前的基于语句的复制时, 从属服务器上的表中的自动增量列必须匹配相同的列 主菜单上的列;也就是说,自动增量列必须是 已复制到自动增量列

这一清单还在继续。如果您的情况是AUTO_INCREMENT不起作用的情况之一,则可以选择

还可以看看这个答案:它是针对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;
正如您所看到的,数字看起来是连续的,但它们仍然可以安全地进行复制

实际上,您可以在某些条件下使用

基于语句的自动增量、上次插入ID和 时间戳值是否正确,取决于以下内容 例外情况:

在使用MySQL 5.7.1之前的基于语句的复制时, 从属服务器上的表中的自动增量列必须匹配相同的列 主菜单上的列;也就是说,自动增量列必须是 已复制到自动增量列

这一清单还在继续。如果您的情况是AUTO_INCREMENT不起作用的情况之一,则可以选择

还可以看看这个答案:它是针对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;

正如您所看到的,数字看起来是连续的,但它们仍然可以安全地进行复制

,但您的自动增量到底有什么问题?如果您使用InnoDB作为表的引擎,为什么不将其作为事务处理?另外,自动增量有什么问题,为什么以后不能使用它?随机数如何帮助您解决此问题?还有一个名为UUID的MySQL函数。如果您担心向公众公开数字标识符,您可以随时对其进行加密或使用哈希ID或类似的方法对其进行编码。但是,AUTO INCREMENT的具体问题是什么?如果您使用InnoDB作为表的引擎,为什么不将其作为事务来执行呢,“自动增量”有什么问题?为什么以后不能使用它?随机数如何帮助您解决这个问题?还有一个名为UUID的MySQL函数。如果你担心向公众公开数字标识符,你总是可以对它们进行加密,或者用hashid或类似的方法对它们进行编码。是的,这看起来像是我想用的东西,如果你能转换它,你就是最好的。是的,这看起来像是我想用的东西,如果你能转换它,你就是最好的