获取非手机iDevices和Android平板电脑的唯一ID

时间:2011-08-29 21:02:30

标签: android ios hash identifier udid

我的应用使用设备的电话号码来获取有关用户联系人的有意义信息。 它在Android和iOS上运行。

在手机上,我只使用10位(无国家代码)电话号码作为用户的唯一标识符。这甚至适用于Android模拟器(它有自己的已解散的数字),虽然iPhone模拟器返回一个空白数字(我可以很容易地忽略这种情况)。

现在我开始测试非手机设备。虽然他们仍有联系人,但他们不再拥有电话号码。一种简单的方法是在iOS中使用UDID以及Android中的等效项。但是,我有两个问题需要解决:

  1. UDID不统一。我需要一个10个字符的密钥。有没有办法将n个字符哈希成10个字符,避免冲突? (我可以忍受非常低概率的碰撞)

  2. 即使是更大的问题:我刚读过Apple is blocking UDID access as of iOS 5。再次,我需要使用什么来维持一个10个字符的密钥呢?

  3. 感谢您的时间。

3 个答案:

答案 0 :(得分:2)

您可以使用任何您想要的哈希方法;如果你要求结果只有10个字符,你可以很容易地将一个较大的哈希值减少到10个字符 - 你可以将结果剪辑为10个字符,你可以将第11个到第20个与第1个到第10个进行异或运算哈希有超过20个字符)等。

Android面临的更大挑战是找到一个独特的设备ID - 谷歌有一个机制,但它依赖于OEM合规性,并且所有设备的合规性并不统一。 Is there a unique Android device ID?包含一些很好的信息。

答案 1 :(得分:2)

您可以使用MAC地址How can I programmatically get the MAC address of an iphone。有一个解决方案可以从MAC地址和github https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5上的应用程序的包标识符创建一个UUID。

我认为iPhone上的MAC地址已足够。 Mac地址有12个字符,所以你只需要决定如何将它压缩到10个字符。

答案 2 :(得分:0)

检查一下它可能会有所帮助。这来自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;
    }
}