Есть некий номер продукта, он должен быть уникальным
нужно генерировать этот номер. как генерировать - свобода, хоть по правилам, хоть рандом
например
создали первый:
Префикс-1323789634
второй:
Префикс-7689465476
третий:
Префикс-5478639379
важно, чтобы это было не просто один за другим, а неким рандомом или правилом.
и чтобы в один прекрасный момент не получилось эксепшена, что такой уже есть в базе
- думал через сиквенс в базе, но вне ордера есть только у oracle, не подходит. или можно как-то делать генерацию сиквенса рандомом?
- делать рандом в коде, а затем проверять есть ли такое уже в базе тоже не очень нравится
- была идея закладывать как-то ид_аккаунта-ещё_ид_чего_нибудь, но эти данные, боюсь, будут расти сильно
В подавляющем большинстве случаев в качестве уникального идентификатора можно взять время в милли/наномилли/микро/наносекундах System.currentTimeMillis() или System.nanoTime(). Можно объединить это время с идентификатором потока (чтобы исключить коллизии при использовании многопоточности) или даже идентификатором сервера если используется несколько серверов (кстати в этом случае даже не обязательно синхронизировать время на машинах).
p.s. сиквенсы есть и в postgres, так же ничто не мешает их реализовать на основе записей в таблице, так же практически все базы без сиквенсов поддерживают autoincrement, соответственно реализуете сиквенс на их основе, удаляя меньшее значение после получения нового.
а autoincrement может только через +1 работать? (ну или через фиксированный шаг)
хотелось бы как раз, чтобы генерировались значения как-то так, вразнобой:
2137326826
6346782343
1939340377
и тд
Нет но если вам надо, можно в базе хранить идентификатор нормальный, который на 1 отличается, а наружу его преобразовывать через какую-нибудь функцию, которая например xor-ила бы биты в нем с каким-нибудь красивым числом.