Как сгенерировать UUID с определённым/постоянным суффиксом?

Рейтинг: 1Ответов: 1Опубликовано: 24.08.2023

Возникла задача создания 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 принимая во внимание тот факт, что префикс "жестко" закреплён?

Ответы

▲ 0

Для Вашей задачи более всего подойдет еще не принятый стандарт UUID v8, причем фиксированный префикс будет размещен в поле custom_a (48 бит).

Поле custom_b (12 бит) можно использовать как часть префикса, если custom_a не достаточно или сгенерировать на основе таймера или заполнить рэндомными значениями.

Поле custom_c (62 бит) можно заполнить рэндомными значениями.

Используйте SecureRandom для минимизации коллизий.