2016-02-19 5 views
0

мой Java JPA Entity использовать следующий код для создания его UUIDjava JPA более короткий UUID?

@Entity 
public class Myclass { 
    @Id 
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid") 
    String id; 

    String name; 
} 

В Oracle и Java в виде строки, идентификатор в конечном итоге что-то вроде этого:

2c96cc2a52f9f9a90152fa6549f40008

32 шестнадцатеричная строка символов.

Мне нужно взаимодействовать с какой-либо третьей стороной, которая должна сохранять мой ID в разных местах, и она должна быть одинаковой. К сожалению, их поля допускают только 30-символьную строку (любой символ, а не только шестнадцатеричный).

Поэтому мне нужно, чтобы мой uuid выглядел как строка длиной 30 символов или меньше, где бы она ни появлялась (в oracle, в java, в этой сторонней системе и т. Д.).

Что я должен делать, чтобы представление этого uuid использовало все буквенно-цифровые символы («ghi ... z», но не странные символы), чтобы быть короче и как убедиться, что это представление является тем, что видно в БД и в приложении?

Большое спасибо

+1

Определение «любой символ». Фактически, определите «char». Что ваша третья сторона определяет как «символ»? – fge

+0

что я имею в виду, я могу использовать свой идентификатор для любых буквенно-цифровых символов: 0-9a-z, в отличие от использования только шестнадцатеричных символов, как это сейчас. – MikaelW

+0

UUID не всегда гарантированно уникален. – Tiny

ответ

2

Если вы готовы иметь дело с некоторыми нечетными ищет ключи, кодировать UUID в базу выше, чем 16, таких как base36 (все буквы и цифры, могут быть чувствительны к регистру) или Base64 (обычно это не безопасно для URL). Если вы хотите, чтобы какой-либо URL-адрес был максимально компактным, вы можете использовать my implementation of Flickr-compatible Base58, который имеет специальные помощники для кодирования и декодирования объектов UUID.

+0

Интересно, но (слишком ленив, чтобы сделать расчет) может ли это фактически уменьшить любой UUID до последовательности, меньшей (или равной) 30 символов, как это требует OP? – fge

+0

@fge UUID имеет длину 128 бит, поэтому должно работать что-нибудь более эффективное, чем около базы 20 (я не могу вспомнить формулу на моем телефоне). База IIRC Base58 не будет содержать более 21 символа. – chrylis

+0

, поэтому я добавил в свой класс объектов метод getId() и setId(), который преобразует строку base16 в base36 строку и обратно (используя BigDecimal). Например, 2c96cc2a52fab0ae0152fab0d60d0000 <> 2n15kgjgtgcoa04nb6a1yxi4g. В моем приложении java, это хорошо, но, к сожалению, в Oracle, DB содержит длинную шестнадцатеричную версию :-( – MikaelW

0

Спасибо за помощь! использование base36 действительно делает трюк. Еще одна вещь, необходимо, однако, чтобы убедиться, что короче ID это тот, который появляется в БД, а также:

@PrePersist 
public void generateId() { 
    String uuid_string = UUID.randomUUID().toString().replaceAll("-",""); 
    BigInteger big = new BigInteger(uuid_string, 16); 
    String same_uuid_shorter_string = big.toString(36); 
    id = same_uuid_shorter_string ; 
} 

(также избавиться от исходных аннотаций генератора ID)

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