我的应用使用设备的电话号码来获取有关用户联系人的有意义信息。 它在Android和iOS上运行。
在手机上,我只使用10位(无国家代码)电话号码作为用户的唯一标识符。这甚至适用于Android模拟器(它有自己的已解散的数字),虽然iPhone模拟器返回一个空白数字(我可以很容易地忽略这种情况)。
现在我开始测试非手机设备。虽然他们仍有联系人,但他们不再拥有电话号码。一种简单的方法是在iOS中使用UDID以及Android中的等效项。但是,我有两个问题需要解决:
UDID不统一。我需要一个10个字符的密钥。有没有办法将n个字符哈希成10个字符,避免冲突? (我可以忍受非常低概率的碰撞)
即使是更大的问题:我刚读过Apple is blocking UDID access as of iOS 5。再次,我需要使用什么来维持一个10个字符的密钥呢?
感谢您的时间。
答案 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;
}
}