Заметки

Archives for: August 2022

Сниппет для сэмплинга пользователей или A/B тестирования (Java)

Допустим, у нас есть стабильный идентификатор пользователя userId. С помощью этой функции мы превращаем строковый идентификатор в псевдослучайное число:

int userNumber = stringIdToSamplingMillis(userId);

Теперь мы можем использовать это число так:

if (userNumber < 50) ... // Пользователь попал в 5% тестовую выборку
if (userNumber < 500) ... // Пользователь попал в категорию A
else ... // Пользователь попал в категорию B

Функция:

    // Генерирует по строке псевдослучайное число от 0 до 999 включительно.
    private static int stringIdToSamplingMillis(final String str) {
        // Используем MD5 в качестве генератора псевдослучайного числа на базе строки
        final MessageDigest hasher = MessageDigest.getInstance("MD5");
        final byte[] data = str.getBytes();
        hasher.update(data, 0, data.length);
        // Получим MD5 в виде длинного целого числа
        final BigInteger bigInt = (new BigInteger(hasher.digest())).abs();
        // Получим хвост длинного целого в виде обычного int-а [0..999]
        return bigInt.mod(BigInteger.valueOf(1000)).intValue();
    }

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/