Безопасный идентификатор в Java с постоянством
Я готовлю библиотеку Java, которой нужно назначить уникальный идентификатор сгенерированным объектам для целей сериализации. После создания уникального идентификатора я должен убедиться, что при следующем использовании библиотеки не будет возможности переназначить идентификатор объекту, который я уже сохранял в прошлом.
Теперь я вижу, что многие в Stackru предлагают полагаться на несколько вариантов, т.е. UUID
, SecureRandom
, но я не уверен, что эти классы соответствуют моим потребностям, и я не уверен, как их использовать.
Пожалуйста, можете ли вы обратиться к нужной утилите для использования и как создать идентификатор?
Решения, основанные на утилитах от Guava/Apache, приветствуются.
2 ответа
Вероятность создания дубликатов UUID довольно низкая. Мне неизвестно о вероятности того, что 2 экземпляра UUID на разных машинах генерируют один и тот же идентификатор, но тогда идентификаторы UUID должны быть уникальными для всех JVM. Я бы не стал встраивать базу данных просто для генерации UUID. Вы можете использовать Java UUID
безопасно.
Альтернативное решение
Если вам нужен уникальный идентификатор для нескольких вызовов программы, используйте последовательность базы данных. Вы можете попросить БД кэшировать следующие N чисел последовательности, чтобы сделать ее разумно быстрой, и значение будет сохраняться при каждом вызове. UUID более удобны в использовании, но оба решения будут работать. Если вы используете БД, вы узнаете номер объекта, который вы сериализовали.
Если вашим объектам нужен уникальный номер, то почему бы просто не сделать последовательность. Вы должны были бы написать собственный класс, который сделал бы следующее:
- Это был бы синглтон
- Нашел последнее значение, использованное объектом при запуске
- Был такой метод, как getNext, который увеличивал lastValue и возвращал значение, которое будет использоваться объектом.
- Сделайте это безопасным.