Как сгенерировать случайное 6-значное целое число, которое является криптографически стойким?

Нам нужна функция, которая с аргументом, состоящим из трех байтов типа bytea (сгенерированного функцией gen_random_bytes расширения pgcrypto), возвращает случайное 6-значное целое число (от 0 до 999999 включительно). 6-значное целое число должно сохранять случайность, заданную аргументом, переданным функции.


person ma11hew28    schedule 26.06.2017    source источник


Ответы (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
comment
Это может генерировать что-то менее 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