Как сгенерировать UUID с определённым/постоянным суффиксом?
Возникла задача создания UUID с определённым префиксом. Префикс должен быть вычисляемым на основании определённой строки, т.е. имея одну и ту-же строку UUID должны иметь один и тот-же префикс. Взяв за основу эту статью и немного модифицировав код получил следующее решение:
import java.util.UUID;
import java.util.Random;
public class App
{
public static void main( String[] args )
{
final long _seed = getStringHashAsLong( "ABCDEF");
for ( int i = 0; i < 10; i++ )
{
final String _uuid = new UUID( _seed, get64LeastSignificantBitsForVersion1() );
System.out.println( _uuid );
}
}
static long get64LeastSignificantBitsForVersion1()
{
final Random random = new Random();
final long random63BitLong = random.nextLong() & 0x3FFFFFFFFFFFFFFFL;
return random63BitLong | 0x8000000000000000L;
}
static long getStringHashAsLong( String string )
{
long h = 1125899906842597L;
final int len = string.length();
for ( int i = 0; i < len; i++ )
{
h = 31 * h + string.charAt( i );
}
return h;
}
}
В результате выполнения программы будет выведено следующее:
ed03fffa-de64-4c88-8000-1769ede97240
ed03fffa-de64-4c88-8437-7931e0f0f93c
ed03fffa-de64-4c88-bc5f-1456e9bed2d0
ed03fffa-de64-4c88-82b9-6df89aa2b7cb
ed03fffa-de64-4c88-b267-8ee8b7dfbcfb
ed03fffa-de64-4c88-9f35-3f0de384775e
ed03fffa-de64-4c88-af51-9133329f766c
ed03fffa-de64-4c88-9985-31199f0a707e
ed03fffa-de64-4c88-a34f-51e13a61bed1
ed03fffa-de64-4c88-86aa-f267d0ddde7a
Простые подсчёты (16 позиций символов суффикса ^ 16 возможных значений в каждой позиции) показывают, что возможных вариантов почти 18 с половиной квадриллионов, но насколько вероятна возможность создания одинаковых UUID принимая во внимание тот факт, что префикс "жестко" закреплён?