У меня есть несколько строк, которые я хотел бы использовать для генерации одной фиксированной строки с определенной длиной.Я пытаюсь обеспечить уникальность в базе данных, а также буду использовать строку для имен файлов;поэтому мне нужно будет избегать столкновений как можно лучше и избегать специальных символов.Мне также нужно, чтобы он был детерминированным, чтобы одни и те же три строки в одном и том же порядке производили одну и ту же строку вывода.
Я думал о конкатенации строк с известным разделителем и кодировке base64.Однако это не фиксированная длина.
Я думал о конкатенации строк, получении хеша из этой строки и кодировании base64.Однако по умолчанию в base64 есть специальные символы, на которые будет жаловаться windoze, и это кажется плохой практикой.
Сейчас я делаю это, что также кажется уродливым:
protected UUID parseUUID() {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
List<String> strings = new ArrayList<>();
strings.add(stringOne);
strings.add(stringTwo);
strings.add(stringThree);
strings.removeIf(str -> str == null || str.isEmpty());
for(int i = 0; i < strings.size(); i++) {
String string = strings.get(i);
string = string.replace("|", "\\|");
strings.set(i, string);
}
String input = String.join("|", strings);
byte[] hash = digest.digest(input.getBytes());
return UUID.nameUUIDFromBytes(hash);
} catch(NoSuchAlgorithmException e) {
return null;
}
}
Каковы шансы столкновения с этим методом?Каков наилучший способ создания детерминированной строки фиксированной длины, подходящей для имени файла, из нескольких входных строк?Конечно, это не так.