Как зафиксировать выбор математически?

Когда у пользователя нет аватарки, часто рисуют цветной кругляш и вписывают туда инициалы пользователя. Есть красивый способ подбирать цвет фона для такой аватарки, почти математически, по имени пользователя.

Или вот, хочется закодить систему АБ тестов. Как понять попадает ли пользователь в этот АБ тест или нет?

Можно выбрать случайный цвет для аватарки из палитры и записать этот цвет в базу. А для АБ тестов, просто распределить пользователей по группам попал / не попал и отразить это распределение в таблице пользователей. Но есть способ красивей! Понадобится немного математики, компьютер сайенса и знаний работы сетей (на самом деле можно все скопировать).

Нужно понять что такое циклический избыточный код или CRC. Это функция нахождения контрольной суммы. Обычно используется для проверки целостности данных. Ну типа, потерялся какой-то байтик, так эта математическая магия его угадывает. Так компенсируются микро-потери при передачи данных по сети.

Cyclic redundancy check на Википедии

Цвет фона для аватарки

Нас интересует возвращаемое значение этой функции — это число! Мы можем превратить любую строку в понятное число. Вот маленький пример, чтобы было понятно вот прям щас. И есть интерактивный примерчик на Кодпене с комментариями.

Пример на Кодпене — про цвет аватарки
const username = "Arthur Bordenyuk";
const colors = ['tomato', 'orangered', 'sandybrown', 'darkolivegreen', 'navy', 'rebeccapurple', 'cadetblue'];
  
// Считаем полином от строки и берем от него модуль
const positiveCrc32 = Math.abs(crc32.str(username));

// Пока имя пользователя и массив цветов не изменились, индекс будет постоянным
const computedIndex = positiveCrc32 % colors.length;

return colors[computedIndex];

Достоин ли пользователь этого АБ теста

Похожим образом будет работать и пример с АБ тестами. Надо все входные значения перевести в числа и начать математическую жесть. Полный пример так же на Кодпене.

Пример на Кодпене — про попадание пользователя в конкретный АБ тест
const splitTestName = "someTestName";
const accountId = 1300;
const DISTRIBUTION_FACTOR = 10007;
const PERCENTAGE_ENABLED = 0.5;

const salt = Math.abs(crc32.str(splitTestName));

return (salt + accountId) % DISTRIBUTION_FACTOR < DISTRIBUTION_FACTOR * PERCENTAGE_ENABLED;

Вот так математика спасла чью-то маленькую базу данных.

Цём

P.S. Свежие посты публикуются в телеграме. Если чувствуешь, что они полезны, то подпишись.

Об Артуре Борденюке

Привет!

Меня зовут Артур. Пишу про код, о проектном управлении и философии

Чибик Артура