Генератор последовательностей

sidorka
На сайте с 17.08.2012
Offline
211
820

Может кто сталкивался с похожей задачей.

Нужен генератор уникальных или близких к этому последовательностей целых чисел от 1 до N по заданному входному параметру.

В принципе кривое решение есть, основанное на md5-хэшах, но оно тяжелое слишком - высчитывается N хэшей и после сортируется. Больше ничего в голову не приходит простого.

Подскажите готовые решения, если есть. Вроде похоже на генератор псевдослучайных последовательностей, но немного не то.

Практическое применение - есть таблица с данными, нужно много уникальных неповторяющихся выборок из нее сделать с возможностью повторения результата.

Сейчас вроде такого

SELECT id, data, MD5(CONCAT(id, 'ПАРАМЕТР')) AS md
FROM table
ORDER BY md
LIMIT СМЕЩЕНИЕ, КОЛИЧЕСТВО

ЗЫ. Хоть подскажите куда смотреть или по какому запросу искать.

Дешевые домены для дорвеев и не только - от 55р (https://goo.gl/Wtnwqp)
danforth
На сайте с 18.12.2015
Offline
153
#1

https://habrahabr.ru/company/virgilsecurity/blog/311676/

sidorka:
уникальных неповторяющихся выборок
sidorka:
с возможностью повторения результата

Так выборки уникальные или нет? На пальцах объясните что хотите сделать.

Junior Web Developer
[umka]
На сайте с 25.05.2008
Offline
456
#2
danforth:
https://habrahabr.ru/company/virgilsecurity/blog/311676/


Так выборки уникальные или нет? На пальцах объясните что хотите сделать.

Хэши — уникальные. Выборки по этим хэшам — повторяющиеся, в зависимости от дополнительного параметра при генерации хэшей.

sidorka, вместо md5 попробуйте использовать математические функции от id (и их комбинации).

Лог в помощь!
Joker-jar
На сайте с 26.08.2010
Offline
167
#3
S
На сайте с 30.09.2016
Offline
469
#4

Может быть, вместо MD5 - разделить на число пи и взять, например, 20 знаков после запятой?

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
sidorka
На сайте с 17.08.2012
Offline
211
#5

Проблема была в слишком больших выборках из базы, там около миллиона строк, для каждой нужно вычислять уникальный идентификатор, потом сортировать... Долго это все.

Решил проще. Добавил столбец для сортировки, чтобы без пропусков было ид. И вот такую функцию накропал опытным путем. Вроде на глаз нормальные последовательности выдает, но бывают пропуски - захватывает не весь диапазон, иногда некоторые числа выпадают, но это некритично в моем случае. Из базы уже выбираю конкретные строки, а не на живую хэши гоняю.

function getnum($index, $param, $max)
{
if ($index * $param <= $max):
return $index * $param;
endif;
$repeat = floor($max / $param) * $param;
$mod = $index * $param - floor($index * $param / $repeat) * $repeat;
return $mod + floor($index * $param / $max);
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий