Осевание SQLite Random ()
Вопрос
SQLite поддерживает посев RANDOM()
функция так же, как mysql делает с RAND()
?
$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;";
От руководства MySQL о RAND(N)
:
Если указан постоянный целочисленный аргумент N, он используется в качестве значения семян, который создает повторяющуюся последовательность значений столбцов. В следующем примере обратите внимание, что последовательности значений, полученных RAND (3), - это то же самое, где это происходит.
Если нет, есть ли способ архивировать тот же эффект, используя только один запрос?
Решение
Если вам нужен псевдослужащий, вы можете сделать что-то подобное (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)';
Кроме того, вы можете установить $ SEEM в предопределенное значение и всегда получают такие же результаты.
Я узнал этот трюк от моего коллеги http://steamcooker.blogspot.com/
Другие советы
Посмотреть на sqlite3_randomness()
Функция:
SQLite содержит высококачественный генератор псевдослучайных чисел (PRNG), используемый для выбора случайных ROWID, при вставке новых записей в таблицу, которая уже использует самую большую возможную ROWID. PRNG также используется для функций SQL SHARDEBLOB () SQL () и Randomblob ().
...
Первый раз, когда эта процедура вызывается (либо внутри, либо приложение) PRNG Семена с использованием случайности, полученные из метода Xrandomness по умолчанию SQLite3_VFS. Отказ На всех последующих вызове псевдо-случайность генерируется внутренне и без пригрева к методу Xrandomness SQLite3_VFS.
Глядя на источник этого xRandomness
метод, вы можете увидеть, что он читает из /dev/urandom
на Unix. В Windows он просто возвращает возвратные значения некоторых временных функций. Таким образом, кажется, что ваш единственный вариант - начать взлом на исходный код SQLite.