"Случайные" идентификаторы
От: malphunction  
Дата: 19.09.10 10:26
Оценка:
Пишу библиотеку, в которой создаются объекты с уникальными идентификаторами. Сейчас это обычный инкремент,
поэтому объекты получают идентификаторы 0, 1, 2, ..., n, n+1, ...

Подскажите какую-нибудь простую функцию, которая по-случайнее "разбрасывает" идентификаторы по некоторому диапазону
(например, [0..UINT_MAX)), но так, чтобы генерируемые идентификаторы оставались уникальными. Например, чтобы
получалась последовательность 54231, 3, 9547, 4431, 1, 8877, ...

Сложность алгоритма должна быть O(1) и без дополнительных огромных массивов и т.п.

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

Было бы идеально получить обратную функцию, ну да это уже не так важно.

Это нужно вот для чего: после генерации с этими идентификаторами производятся некие манипуляции,
поэтому хочется проверить поведение библиотеки на разных значениях этих идентификаторов (и её независимость от
прямого следования). Кроме того, пользователи могут подумать, что идентификаторы последовательны и использовать
это в своих корыстных целях -- например, они могут полагать, что первый объект всегда имеет идентификатор 0, и явно забивать
этот 0 в свои программы (а не использовать getNextId() из моей библиотеки). Да и внутри библиотеки это не
помешает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.