Получение уникального идентификатора не-телефона iDevices и планшетов Android - PullRequest
2 голосов
/ 30 августа 2011

Мое приложение использует номер телефона устройства для получения значимой информации о контактах пользователя.Работает на Android и iOS.

В телефоне я просто использую 10-значный номер телефона (без кода страны) в качестве уникального идентификатора пользователя.Это даже работает на симуляторе Android (у которого есть собственный несуществующий номер), хотя симулятор iPhone возвращает пустое число (я могу легко проигнорировать этот случай).

Теперь я приступил к тестированию на не телефонных устройствах.Хотя у них по-прежнему есть контакты, у них больше нет номера телефона.Простым подходом было бы использовать UDID в iOS и любой другой эквивалент в Android.Однако у меня есть 2 проблемы, которые мне нужно решить:

  1. UDID не является однородным.Мне нужен ключ из 10 символов.Есть ли способ хешировать n-символов в 10-символьные, избегая коллизий?(Я могу жить с коллизиями с очень низкой вероятностью)

  2. Еще большая проблема: я только что прочитал, что Apple блокирует доступ UDID с iOS 5 .Что я должен использовать вместо этого, опять же, с необходимостью сохранить ключ из 10 символов?

Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

Вы можете использовать MAC-адрес Как программно получить MAC-адрес iphone .Существует решение, которое создает UUID из MAC-адреса и идентификатора пакета приложения на github https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5.

Я думаю, что MAC-адрес на iphone является адекватным.Mac-адреса имеют 12 символов, поэтому вам просто нужно решить, как вы хотите использовать его до 10 символов.

2 голосов
/ 30 августа 2011

Вы можете использовать любой хэш-метод, который пожелаете;если у вас есть требование, чтобы результат составлял всего 10 символов, вы можете достаточно легко уменьшить больший хэш до 10 символов - вы можете обрезать результат до 10 символов, вы можете выполнить XOR с 11 по 20 с 1 по 10 (циклически, еслихэш содержит более 20 символов) и т. д.

Более сложная задача для Android будет заключаться в поиске уникального идентификатора устройства - есть механизм, который Google ввел в действие, однако он полагается на соответствие OEM иэто соответствие не является одинаковым для всех устройств. Существует ли уникальный идентификатор устройства Android? содержит некоторую полезную информацию.

0 голосов
/ 30 августа 2011

Проверьте это, это может помочь.Это из Localytics с открытым исходным кодом SDK

/**
 * Gets a 1-way hashed value of the device's unique ID. This value is
 * encoded using a SHA-256 one way hash and cannot be used to determine what
 * device this data came from.
 * 
 * @param appContext
 *            The context used to access the settings resolver
 * @return An 1-way hashed identifier unique to this device or null if an
 *         ID, or the hashing algorithm is not available.
 */
public static String getGlobalDeviceId(final Context appContext) {
    String systemId = System.getString(appContext.getContentResolver(),
            System.ANDROID_ID);
    if (systemId == null) {
        return null;
    }

    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(systemId.getBytes());
        BigInteger hashedNumber = new BigInteger(1, digest);
        return new String(hashedNumber.toString(16));

    } catch (NoSuchAlgorithmException e) {
        return null;
    }
}
...