Как дать каждому объекту в документе уникальный идентификатор? - PullRequest
1 голос
/ 27 октября 2010

Я делаю растровый редактор, где документ состоит из нескольких слоев, где каждый слой представляет растровое изображение. Каждый слой должен иметь уникальный идентификатор по сравнению со всеми другими слоями, которые в настоящее время существуют в документе. Мне также нужно учитывать, что мне нужно сохранять и загружать документы вместе с идентификаторами слоев.

Я использую шаблон команды для хранения действий, выполняемых над документом, а уникальные идентификаторы используются для отслеживания того, на каком слое должно быть выполнено действие.

В данный момент я просто держу счетчик под названием X, когда создается новый слой, его ID устанавливается в X, а затем X увеличивается. При загрузке мне нужно убедиться, что X установлен на соответствующее число, чтобы новым слоям были присвоены уникальные идентификаторы, т. Е. Я мог бы сохранить значение X и восстановить его или установить X на основе наибольшего загруженного идентификатора слоя.

Учитывая, что X является 32-битным числом, пользователю нужно будет создать 4 294 967 296 слоев, работающих над одним файлом, прежде чем идентификаторы начнут использоваться повторно, что приведет к странному поведению. Должен ли я внедрить лучшую систему уникальных идентификаторов или это достаточно хорошо?

Я на Java, поэтому я мог бы использовать библиотеку UUID, которая создает 128-битные уникальные идентификаторы в соответствии со стандартным алгоритмом. Это кажется излишним.

Есть ли какой-то общий подход к такого рода проблеме?

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

Это достаточно хорошо. Со скоростью десять новых слоев в секунду 24/365, что глупо, он будет работать нормально примерно три года.

0 голосов
/ 27 октября 2010

Если вы думаете, что можете манипулировать слоями программно, и, таким образом, есть некоторая возможность иметь 2 ^ 32 слоя во время жизни изображения, то выбросьте все идентификаторы слоев в HashSet при чтении файла и обновите этот набор при Вы добавляете / удаляете слои. (Вам не нужно явно хранить набор; достаточно идентификатора, связанного с каждой маской.) Затем вместо «следующего номера» возьмите «следующий номер, которого нет в наборе». Наличие счетчика по-прежнему полезно, но установить значение 0 или (макс + 1) при чтении файла не имеет значения; не потребуется много времени, чтобы найти пустое пространство, если вы не представляете, что одновременно присутствует большое количество слоев.

Но так как вы используете Java, вы можете просто использовать long вместо int, и тогда вы никогда не сможете (практически говоря) переполнить число, даже если все, что вы сделали, это создали однопиксельный маскировать и уничтожать его снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...