Php 为mysql生成数字
我正在创建一个论坛,只是为了测试,我已经达到了同步线程列表和帖子的地步。我一直依赖mysql中的自动增量来同步它们,但我知道它在将来不会有用 我现在的问题是,如何像mysql自动增量一样生成随机数堆叠 要查看线程列表,当前 $sql=从线程中选择*,其中THU unique='$section'; $result=mysqli_query$db,$sql 然后我只是获取数据并输出列表中的线程 基本上,当发送插入查询时,如何生成一个类似于自动递增的数字 我知道rand,但我觉得它最终没有效果,因为它可能会重叠,并使用已经存在的相同号码。实际上,在某些条件下,您可以使用 基于语句的自动增量、上次插入ID和 时间戳值是否正确,取决于以下内容 例外情况: 在使用MySQL 5.7.1之前的基于语句的复制时, 从属服务器上的表中的自动增量列必须匹配相同的列 主菜单上的列;也就是说,自动增量列必须是 已复制到自动增量列 这一清单还在继续。如果您的情况是AUTO_INCREMENT不起作用的情况之一,则可以选择 还可以看看这个答案:它是针对python/django的,下面是它转换为PHP时的样子Php 为mysql生成数字,php,mysql,Php,Mysql,我正在创建一个论坛,只是为了测试,我已经达到了同步线程列表和帖子的地步。我一直依赖mysql中的自动增量来同步它们,但我知道它在将来不会有用 我现在的问题是,如何像mysql自动增量一样生成随机数堆叠 要查看线程列表,当前 $sql=从线程中选择*,其中THU unique='$section'; $result=mysqli_query$db,$sql 然后我只是获取数据并输出列表中的线程 基本上,当发送插入查询时,如何生成一个类似于自动递增的数字 我知道rand,但我觉得它最终没有效果,因为
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或类似的方法对它们进行编码。是的,这看起来像是我想用的东西,如果你能转换它,你就是最好的。是的,这看起来像是我想用的东西,如果你能转换它,你就是最好的