Я хотел бы создать случайную строку для использования при проверке сеанса с помощью PostgreSQL. Я знаю, что могу получить случайное число SELECT random()
, поэтому попробовал SELECT md5(random())
, но это не сработало. Как я могу это сделать?
postgresql
random
Герш
источник
источник
random()
нет необходимости). Если это не то, что я предполагаю, тогда мой ответ должен быть связан с уточненным вопросом.Ответы:
Я бы предложил такое простое решение:
Это довольно простая функция, которая возвращает случайную строку заданной длины:
И использование:
Пример вывода:
источник
chars[1+random()*(array_length(chars, 1)-1)]
наchars[ceil(61 * random())]
random()
получаетlength
время вызова (как и во многих других решениях). Есть ли более эффективный способ выбирать каждый раз из 62 символов? Как это работает по сравнению сmd5()
?ORDER BY random()
. Что быстрее?Вы можете исправить свою первоначальную попытку следующим образом:
Намного проще, чем некоторые другие предложения. :-)
источник
SELECT concat(md5(random()::text), md5(random()::text));
И если вы хотите где-то посередине (например, 50 символов), вы можете взять подстроку из этого:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: быстрее, с большей случайностью, более эффективно храниться в базе данных.SELECT md5(random()::text||random()::text);
, илиSELECT md5(random()::text||random()::text||random()::text);
Основываясь на решении Марцина, вы можете сделать это, чтобы использовать произвольный алфавит (в данном случае все 62 буквенно-цифровых символа ASCII):
источник
Check out this for a totally different method using gen_random_uuid()
: быстрее, больше случайности, более эффективно хранится в базе данных.Вы можете получить 128 бит случайного числа из UUID. Это метод, позволяющий выполнить работу в современном PostgreSQL.
Возможно, стоит также прочитать документацию по UUID
Насколько редко встречается столкновение с UUID, или можно догадаться? Предполагая, что они случайны,
источник: википедия
В итоге,
gen_random_uuid()
- это 128 битов случайного хранения, хранящиеся в 128 битах (2 ** 128 комбинаций). 0-отходы.random()
генерирует только 52 бита случайного в PostgreSQL (2 ** 52 комбинации).md5()
хранится как UUID - 128 бит, но он может быть таким же случайным, как и его вход ( 52 бита при использованииrandom()
)md5()
хранится в виде текста, составляет 288 бит, но он может быть только таким же случайным, как и его вход ( 52 бита, если используетсяrandom()
) - более чем в два раза больше размера UUID и часть случайности)md5()
как хеш, может быть настолько оптимизирован, что мало что дает.text
and иvarchar
т. Д., Которые хранятся как a, уvarlena
которого есть накладные расходы на длину строки.источник
Недавно я играл с PostgreSQL и думаю, что нашел немного лучшее решение, использующее только встроенные методы PostgreSQL - без pl / pgsql. Единственное ограничение - в настоящее время он генерирует только строки UPCASE, числа или строки в нижнем регистре.
Второй аргумент
generate_series
метода определяет длину строки.источник
array_to_string(ARRAY(SELECT chr((65 + round((random()+my_id-my) * 25)) :: integer) FROM generate_series(1,8)), '')
array_to_string(ARRAY(SELECT chr((65 + round((random() * 25 + id) :: integer % 25 )) :: integer) FROM generate_series(1, 60)), '');
Пожалуйста, используйте
string_agg
!Я использую это с MD5 также для генерации UUID. Мне просто нужно случайное значение с большим количеством бит, чем
random ()
целое число.источник
random()
пока не получу нужное количество бит. Ну что ж.Хотя по умолчанию оно не активно, вы можете активировать одно из основных расширений:
Тогда ваш оператор становится простым вызовом gen_salt (), который генерирует случайную строку:
Ведущее число - это хэш-идентификатор. Доступно несколько алгоритмов, каждый со своим идентификатором:
Подробнее о расширениях:
РЕДАКТИРОВАТЬ
Как указал Эван Кэррол, начиная с версии 9.4 вы можете использовать
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
источник
$1$
? Это идентификатор типа хэша (md5 == 1), остальное - случайное значение.Не думаю, что вы ищете случайную строку как таковую. Для проверки сеанса вам понадобится строка, которая гарантированно будет уникальной. Вы храните информацию о проверке сеанса для аудита? В этом случае вам нужно, чтобы строка была уникальной между сеансами. Я знаю два довольно простых подхода:
Уникальность UUID гарантируется в силу алгоритма их генерации; эффективно это чрезвычайно маловероятно, что вы сгенерируете два одинаковых числа на любой машине, в любое время и когда-либо (обратите внимание, что это намного сильнее, чем для случайных строк, которые имеют гораздо меньшую периодичность, чем UUID).
Вам необходимо загрузить расширение uuid-ossp, чтобы использовать UUID. После установки вызовите любую из доступных функций uuid_generate_vXXX () в ваших вызовах SELECT, INSERT или UPDATE. Тип uuid представляет собой 16-байтовое число, но также имеет строковое представление.
источник
Параметр INTEGER определяет длину строки. Гарантированно охватывает все 62 буквенных символа с равной вероятностью (в отличие от некоторых других решений, которые можно найти в Интернете).
источник
Check out this for a totally different method using gen_random_uuid()
: быстрее, больше случайности, более эффективно хранится в базе данных.gen_random_uuid()
появился в версии 9.4, насколько я могу судить, которая была выпущена 2014-12-18, более чем через год после вашего отрицательного ответа. Дополнительная придирка: ответу всего 3 1/2 года :-) Но вы правы, теперь, когда у нас естьgen_random_uuid()
, это то, что следует использовать. Поэтому я поддержу ваш ответ.@Kavius рекомендуется использовать
pgcrypto
, но вместо тогоgen_salt
, что оgen_random_bytes
? А как насчетsha512
вместоmd5
?Документы:
источник
select * from md5(to_char(random(), '0.9999999999999999'));
источник
источник