播种SQLite RANDOM()

时间:2010-01-31 12:03:38

标签: mysql sql sqlite random seeding

SQLite是否支持播种 RANDOM() 功能,就像MySQL使用 RAND() 一样?

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

来自MySQL手册关于RAND(N)

  

如果是一个常数整数参数N.   指定,它用作种子   值,产生可重复的   列值序列。在里面   下面的例子,请注意   由...产生的值序列   兰德(3)两个地方都是一样的   它发生了。

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

2 个答案:

答案 0 :(得分:10)

查看sqlite3_randomness()功能:

  

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

     

...

     

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

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

答案 1 :(得分:5)

如果你需要一个伪随机顺序,你可以做这样的事情(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/

那里学到了这个技巧