2012-12-19 57 views
2

我想爲我的應用程序生成一個uuid,我嘗試了很多東西,例如wifi mac地址,獲取android id,序列號,從設備 android.os.Build屬性創建僞uuid。Android和Java Uuid

我也來通過幾篇文章和博客去我對此感到有點困惑知道,Java本身有UUID創一流 java.util.UUID

。我想知道如果兩個Android設備使用這個Java類(java.util.UUID)創建uuid,那麼它們是獨一無二的還是有重複的機會?

同樣在一些設備中,我無法使用android.os.Build.SERIAL找到序列號。有另一種方式來獲得設備的序列號

回答

8

假設你正在使用的java.util.UUID中的randomUUID()功能有一個理論上存在重複的機會,但它非常遙遠。生成的id是RFC4122版本4的ID,其中122位隨機設置。這意味着有5.32 x 10^36個可能的值。從某種角度來看,如果你有十億個設備,每個設備每秒產生十億個ID,那麼完成它們大約需要1680億年(大約是宇宙年齡的10倍)。

所以,是的,重複是可能,但(假設Java使用高質量的隨機數發生器),它實際發生的可能性是如此之遙以至於毫無意義。

+0

要更清楚你的意思是在現實世界中複製的可能性是微不足道的,對嗎? – edwin

+1

是的。見http://stackoverflow.com/questions/2513573/how-good-is-javas-uuid-randomuuid – broofa

+0

謝謝你的回答。 – edwin

1

來獲取設備ID使用Telephoney U可以用在這裏是很

public static String deviceUDID(Context ctx) { 
    final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 

    final String tmDevice, tmSerial, androidId; 
    tmDevice = "" + tm.getDeviceId(); 
    tmSerial = "" + tm.getSimSerialNumber(); 
    androidId = "" +android.provider.Settings.Secure.getString(ctx.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); 

    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); 
    String deviceId = deviceUuid.toString(); 
    Log.d("Device Id", deviceId); 
    return deviceId; 
} 
+0

是這個設備ID一個設備序列號是否一樣?此代碼是否適用於平板電腦? (不幸的是我沒有平板設備進行測試) – edwin

+1

沒有兩個都是不同的東西都添加解決衝突(如果有任何)在UUID 和是的,它會在平板電腦 尚未測試,但它的a通用 你可以添加許多其他參數比這個「getSimSerialNumber()」有很多更多的功能 –

+0

但「getSimSerialNumber()」將在CDMA設備的情況下返回null(我讀了可能的文章,一些平板設備也給null對於這種方法) – edwin