Создать уникальный идентификатор - PullRequest
17 голосов
/ 30 января 2012

Мне нужно создать уникальные идентификаторы для моего приложения.Когда я использовал (UUID.randomUUID()).toString(), я получаю код (думая, что он будет уникальным), который очень длинный.

Я не уверен, насколько он будет уникальным, когда мы генерируем коды с помощью JavaВременная метка или случайная строка.

Мне нужно генерировать уникальные коды, длина которых составляет 8-10 символов (буквенно-цифровая).Как получить так?Я использую базу данных MySQL.

Является ли создание уникального кода на стороне базы данных наилучшим способом или мы можем генерировать такие короткие (но уникальные) коды в Java?

Любые предложения с примером кода будут очень полезны.

Ответы [ 6 ]

22 голосов
/ 30 января 2012

Я использую RandomStringUtils.randomAlphanumeric() метод из commons-lang для достижения этой цели:

import org.apache.commons.lang.RandomStringUtils;

public static final int ID_LENGTH = 10;

public String generateUniqueId() {
    return RandomStringUtils.randomAlphanumeric(ID_LENGTH);
}

Если вы используете Maven, убедитесь, что вы добавили commons-lang к зависимостям проекта:

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

Является ли генерация уникального кода на стороне базы данных лучшим способом или мы можем генерировать такие короткие (но уникальные) коды в Java?

Это зависит от вас и вашего проекта.Является ли генерация идентификаторов частью бизнес-логики?Если да и вся логика написана на Java, то напишите это на Java.Если вся или какая-то часть логики делегирована базе данных, генерируйте идентификатор там (но в этом случае вы будете сильно зависеть от конкретной базы данных).

7 голосов
/ 30 января 2012

Есть ли у вас какие-то особые ограничения, которые необходимо учитывать? Например, уникальность кросс-приложений? В противном случае MySQL вполне способен генерировать идентификаторы самостоятельно, все, что вам нужно сделать, это определить столбец autoincrement и не указывать его во время вставки (то есть вставляя для него значение NULL) - это заставит MySQL заполнить его следующим доступным идентификатором, уникальным и не требующим от вас работы.

Это не будет буквенно-цифровая строка (которую я не уверен, если вы указали в качестве требования или ограничения), но если все, что вам нужно, это уникальность, этого более чем достаточно. 8-10 буквенно-цифровых символов недостаточно, чтобы гарантировать уникальность случайно сгенерированной строки, поэтому вам придется выполнить проверку вставки в базу данных.

5 голосов
/ 30 января 2012

Является ли генерация уникального кода на стороне базы данных лучшим способом или мы можем генерировать такие короткие (но уникальные) коды в Java?

Базы данных предназначены для возможности генерировать уникальные идентификаторыгде необходимо.Я сомневаюсь, что все, что вы (или я) могли бы написать, было бы «лучшим» вариантом этого.

1 голос
/ 12 июня 2014

Я написал простой сервис, который может генерировать полу-уникальные непоследовательные 64-битные числа.Он может быть развернут на нескольких машинах для обеспечения избыточности и масштабируемости.Он использует ZeroMQ для обмена сообщениями.Для получения дополнительной информации о том, как это работает, смотрите страницу github: zUID

0 голосов
/ 18 октября 2016

Вопрос о том, должна ли часть генерации идентификатора выполняться в базе данных или в конце Java: Вы должны ответить на этот вопрос в зависимости от требований вашего приложения:

1) Одним из способов является System.currenTimeMillis ()Но если ваша заявка будет работать в мульти-кластерной среде, тогда вы можете получить дублирующиеся значения.

http://www2.sys -con.com / itsg / virtualcd / java / archives / 0512 / Westra / index.html

2) Другой способ - использовать UUID Generator. Он поможет вам в случае, если у вас есть разные базы данных, которые необходимо объединить.Используя этот метод, вам не нужно беспокоиться о дублировании идентификатора при объединении баз данных.

https://marketplace.informatica.com/solutions/mapping_uuid_using_java

Возможно, вы захотите рассмотреть и другие факторы.По вашему вопросу будет идти UUID метод.

0 голосов
/ 26 октября 2014

Взгляните на: UIDGenerator.java

Вы можете настроить его (уникально для обработки или всего мира), он прост в использовании и быстр:

    private static final UIDGenerator SCA_GEN = new UIDGenerator(new ScalableSequence(0, 100));
.......
    SCA_GEN.next();

Вы можете изменить реализацию, чтобы уменьшить размер идентификатора (и добавить другие компромиссы)

см. Мои результаты тестирования в:

http://zoltran.com/roller/zoltran/entry/generating_a_unique_id

или запустите их самостоятельно.

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