![](/img/trans.png)
[英]Why does CLASS_TYPE_PHONE allow non-phone characters in Android?
[英]Getting unique ID of non-phone iDevices and Android tablets
我的應用程序使用設備的電話號碼來獲取有關用戶聯系人的有意義的信息。 它可以在Android和iOS上運行。
在電話上,我僅使用10位(無國家/地區代碼)電話號碼作為用戶的唯一標識符。 這甚至可以在Android模擬器(具有自己的無效數字)上運行,盡管iPhone模擬器返回一個空白數字(我很容易忽略這種情況)。
現在我要在非電話設備上進行測試。 盡管他們仍然有可用的聯系人,但他們不再有電話號碼。 一種簡單的方法是在iOS中使用UDID,而在Android中使用等效的方法。 但是,我有兩個問題需要解決:
UDID不統一。 我需要一個10個字符的密鑰。 有什么方法可以將n個字符散列為10個字符,從而避免沖突? (我可以承受極低的概率碰撞)
甚至更大的問題:我剛剛讀到Apple從iOS 5開始就禁止UDID訪問 。 再次需要維護10個字符的密鑰時,我該用什么代替呢?
謝謝你的時間。
您可以使用任何所需的哈希方法; 如果您要求結果只能是10個字符,則可以輕松地將較大的哈希減少到10個字符-您可以將結果裁剪為10個字符,可以將11號到20號與1號到10號進行XOR(如果您將哈希超過20個字符),等等。
Android上的更大挑戰是找到一個唯一的設備ID-Google已采用一種機制,但是它依賴於OEM合規性,並且合規性並非在所有設備上都統一。 是否有唯一的Android設備ID? 包含一些很好的信息。
您可以使用MAC地址如何以編程方式獲取iPhone的MAC地址 。 有一種解決方案可以從github https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5上的應用程序的MAC地址和捆綁包標識符創建一個UUID。
我認為iPhone上的MAC地址足夠。 Mac地址有12個字符,因此您只需要決定如何將其壓縮為10個字符即可。
檢查一下可能有幫助。 這是來自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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.