当前位置:  开发笔记 > 后端 > 正文

播种SQLite RANDOM()

如何解决《播种SQLiteRANDOM()》经验,为你挑选了2个好方法。

SQLite是否支持RANDOM()以与MySQL相同的方式播种函数RAND()

$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;";

从MySQL手册关于RAND(N):

如果指定了常量整数参数N,则将其用作种子值,从而生成可重复的列值序列.在下面的示例中,请注意RAND(3)生成的值序列在它出现的两个位置都是相同的.

如果没有,有没有办法只使用一个查询存档相同的效果?



1> Thomas..:

看看这个sqlite3_randomness()功能:

SQLite包含一个高质量的伪随机数生成器(PRNG),用于在将新记录插入已使用最大可能ROWID的表时选择随机ROWID.PRNG还用于内置random()和randomblob()SQL函数.

...

第一次调用此例程(内部或应用程序)时,PRNG 使用从默认sqlite3_vfs对象的xRandomness方法获得的随机性进行播种.在所有后续调用中,伪随机性在内部生成,无需求助于sqlite3_vfs xRandomness方法.

查看此xRandomness方法的来源,您可以看到它/dev/urandom在Unix上读取.在Windows上,它只返回某些时间函数的返回值.因此,似乎您唯一的选择就是开始攻击SQLite源代码.



2> 小智..:

如果您需要伪随机顺序,则可以执行以下操作(PHP):

$seed = md5(mt_rand());
$prng = ('0.' . str_replace(array('0', 'a', 'b', 'c', 'd', 'e', 'f'), array('7', '3', '1', '5', '9', '8', '4'), $seed )) * 1;
$query = 'SELECT id, name FROM table ORDER BY (substr(id * ' . $prng . ', length(id) + 2)';

另外,您可以将$ seed设置为预定义值,并始终获得相同的结果。

我已经从我的同事http://steamcooker.blogspot.com/中学到了这个技巧

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有