Нам нужна функция, которая с аргументом, состоящим из трех байтов типа bytea
(сгенерированного функцией gen_random_bytes
расширения pgcrypto
), возвращает случайное 6-значное целое число (от 0 до 999999 включительно). 6-значное целое число должно сохранять случайность, заданную аргументом, переданным функции.
Как сгенерировать случайное 6-значное целое число, которое является криптографически стойким?
comment
Возможный дубликат Что самый простой способ представить байт в виде одного целого числа в PostgreSQL?
- person JJJ   schedule 26.06.2017
Ответы (2)
В случае 3 байтов возьмите 6 последних символов, добавьте перед ними 'x'
, преобразуйте в битовую строку, а затем в int:
select ('x' || right(gen_random_bytes(3)::text, 6))::bit(24)::int;
Более подробная информация содержится в аналогичном вопросе: postgresql">Как проще всего представить байт в виде одного целого числа в PostgreSQL?
person
Nick
schedule
26.06.2017
Это может генерировать что-то менее 6 цифр
- person Christiaan Westerbeek; 30.04.2018
Возможно, я слишком усложняю, но мне нужно убедиться, что в строке ровно n числовых цифр. Допускается повторение номеров.
SELECT string_agg(shuffle('0123456789')::char, '')
FROM generate_series(1, 6);
С функцией перемешивания, представленной в другом ответе, который я скопировал здесь для удобства.
create or replace function shuffle(text)
returns text language sql as $$
select string_agg(ch, '')
from (
select substr($1, i, 1) ch
from generate_series(1, length($1)) i
order by random()
) s
$$;
person
Christiaan Westerbeek
schedule
30.04.2018