У меня есть простой медиа-клиент/сервер, я написал, и я хочу, чтобы генерировать неочевидное значение времени я посылаю с каждым команды от клиента к серверу. Временные метки будут иметь справедливый бит данных (nano-second resolution, даже если это не совсем верно, из-за ограничений выборки таймера в современных операционных системах) и т. Д.Генерация (очень) большая неповторяющаяся целочисленная последовательность без предварительного перетасовки
Что я пытаюсь сделать (на Linux, в C), состоит в том, чтобы генерировать взаимно однозначную последовательность n-битовых значений (предположим, что данные хранятся в 128-битных элементах массива-на-int) без перекрывающихся/сталкивающихся значений. Затем я принимал псевдослучайное значение 128 бит/номер в качестве «соли», применял его к отметке времени, а затем начинал отправлять команды на сервер, увеличивая предварительно соленое/предварительно хешированное значение.
Причина, по которой размер временной метки настолько велик, поскольку временная метка может потребоваться для очень большой продолжительности времени.
Вопрос
Как я мог выполнить такую последовательность (не сталкивающийся) с начальным значением соли?The best approach that sounds along the lines of my goal is from this post, which notes:
Если вариант 1 не "случайный" достаточно для вас, используйте CRC-32 хэш сказал глобальной (32-бит) счетчик. Существует 1-к-1 сопоставление (биекция) между N-разрядными целыми числами и их CRC-N, поэтому уникальность будет по-прежнему гарантирована.
Однако, я не знаю:
- Если можно (эффективно) быть продлен до 128-битовых данных.
- Если какое-либо дополнение к умножению на соль, чтобы обеспечить начальное семя для последовательности, это нарушит его или приведет к столкновениям.
Последующая деятельность
Я понимаю, что я мог бы использовать 128bit случайную хэш из libssl
или что-то подобное, но я хочу, удаленный сервер, используя то же значение соли, чтобы иметь возможность конвертировать хешированные временные метки возвращаются к их истинным значениям.
спасибо.
Что касается последовательности: [Xorshift128] (https://en.wikipedia.org/wiki/Xorshift) - это быстрый 128-разрядный генератор псевдослучайных чисел с периодом 2¹²⁸-1. То есть, учитывая любое ненулевое 128-битное число, оно дает другое ненулевое 128-битное число; последовательность проходит через все 128-битные целые без знака, кроме нуля. Все n-разрядные PRNG с периодом (2ⁿ) -1 имеют такие особенности, а не только линейные конгруэнтные. –
Будущая проверка вашей программы до жары смерти Вселенной. Мне нравится ... – 2501
Да, вы можете расширить CRC до 128 бит, и вы можете найти коэффициенты для этого на странице [LFSR] (https://en.wikipedia.org/wiki/Linear-feedback_shift_register) Википедии, но для чего она достигает есть более эффективные операции. И да, вы можете добавить или умножить (если это нечетно) вашу соль на любую эквивалентную функцию без введения коллизий (mod 2 ** 128). Пока обе функции равны 1: 1, результат их цепочки также должен быть 1: 1. У меня есть такая функция, но я должен расширить свой инструмент поиска до 128 бит, чтобы найти для него хорошие параметры. – sh1