Создать уникальный идентификатор - программирование
Подтвердить что ты не робот

Создать уникальный идентификатор

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

Я не уверен, насколько это уникально, когда мы генерируем коды с помощью Java Timestamp или randomstring.

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

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

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

4b9b3361

Ответ 1

Я использую метод 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. Если все или какая-то часть логики делегирована в базу данных, поэтому сгенерируйте идентификатор там (но в этом случае у вас будет сильная зависимость от конкретной базы данных).

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Взгляните на: 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

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

Ответ 6

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

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

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

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

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

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