2012-01-30 4 views
16

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

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

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

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

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

+0

Вы хотите создать свой собственный метод для генерации уникального идентификатора с использованием метки времени? –

+0

Вы можете получить один уникальный номер и затем каждый раз увеличивать его на 1 при записи записей в БД. – Ved

+2

@Sathish: Почему бы не получить подстроку() в соответствии с вашей желаемой длиной и продолжать проверять, соответствует ли новая, какой-либо ранее назначенной. UUID - лучший способ :-) С уважением –

ответ

21

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

+0

Привет .. Большое спасибо .. Используя randomAlphanumeric(), мы получаем коды в соответствии с длиной, которую хотим ... но уникальным? –

+1

'randomAlphanumeric()' генерирует строку со случайными символами и в большинстве случаев ее уникальную (вы также можете попробовать запустить ее в цикле и сгенерировать новую, если ее не существует). –

+0

Спасибо .. наконец, я использовал RandomStringUtils.randomAlphanumeric (10), чтобы сгенерировать код и проверить его существование в базе данных. Если не существует, я использую его как свой уникальный код. –

5

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

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

+0

Спасибо. Если да, можете ли вы привести несколько примеров того, как создавать уникальные идентификаторы для баз данных MySQL. –

+2

Попробуйте [любой из этих] (http://www.google.com.au/search?q=generate+unique+IDs+for+MySQL&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en- США: официальный и клиент = светлячок-а). Я не использую БД на ежедневной основе и никогда не использовал MySQL. –

+0

Спасибо за предложение google :) –

7

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

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

1

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

0

Примите взгляд на: UIDGenerator.java

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

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

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

видеть мои результаты сравнительного анализа по адресу:

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

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

+0

В случае, если я использую UID Generator, он будет уникальным в многокомпонентном Java-приложении, будет ли этот идентификатор уникальным, даже если сервер перезагружен? –

0

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

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

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

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

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

Там могут быть и другие факторы, которые вы можете рассмотреть. Согласно вашему вопросу, метод UUID пойдет.

Смежные вопросы