Назначение уникального идентификатора каждый раз, когда приложение Android открыто

Я создаю приложение, основной целью которого является сбор данных для экспериментов, которые оно загружает в базу данных в конце каждого эксперимента. Я хочу назначать уникальный идентификатор при каждом запуске эксперимента (либо открытие приложения, либо перезапуск эксперимента).

Я не могу использовать идентификатор, который является уникальным только для устройства, поскольку на каждом устройстве будет выполнено несколько экспериментов.

Я не могу использовать идентификатор, основанный на времени эксперимента (или какой-либо другой форме последовательного назначения), поскольку несколько устройств могут одновременно отправлять свои данные.

На данный момент мое решение состоит в том, чтобы назначать случайное число при каждом запуске эксперимента, которое проверяется по базе данных и пересчитывается, если оно существует. Это не идеально, поскольку возможно, но редко, что два эксперимента будут проводиться одновременно и будут назначены (случайно) одному и тому же идентификатору.

Как назначить уникальный идентификатор при каждом запуске эксперимента?

3 ответа

Решение

То, что вы делаете, уже правильно.

При этом, если вы действительно не хотите проверять базу данных каждый раз, когда делаете вставку, вы всегда можете объединить уникальный MAC-адрес Wi-Fi устройства с уникальной отметкой времени. Не используйте номер IMEI (например, планшеты, использующие только Wi-Fi, не имеют номера IMEI, и технически номера IMEI также могут конфликтовать из-за небрежных производителей).

Являются ли MAC-адреса Wi-Fi уникальными? Это также не гарантируется, но если вы объедините его с меткой времени, это увеличит вероятность отсутствия столкновения.

И если вы хотите еще больше повысить свои шансы, вы всегда можете объединить MAC-адрес Wi-Fi вместе с отметкой времени и UUID. Опять же, эта стратегия также не гарантирует уникальность, но, на мой взгляд, она довольно близка.

Вы можете использовать UUID. Из документа:

UUID is an immutable representation of a 128-bit universally unique identifier

Практически нулевой шанс, что 2 эксперимента будут проводиться одновременно с точностью до миллисекунд, не говоря уже о наносекундах, которые вы можете получить из системы. Так что вы можете легко положиться на их уникальность. Если вас это не устраивает, объедините идентификатор устройства со временем в наносекундах до эксперимента, что снизит вероятность его столкновения. Если вы хотите сойти с ума. Создайте сервер, который будет иметь хэш-карту всех сгенерированных им чисел и будет создавать новый для каждого экземпляра экспериментального приложения. Я дам вам алгоритм, чтобы сделать его эффективным, если хотите.

Вы также можете использовать GUID https://www.guidgenerator.com/ который в основном эквивалентен случайному выбору числа от 0 до 2^128-1, что является МНОГО.

Другие вопросы по тегам