Android和Java UUID

3

我想为我的应用程序生成一个uuid,尝试了许多方法,如wifi mac地址、获取android id、序列号、从设备中创建伪uuidandroid.os.Build属性。

我还知道Java本身有Uuid创建类java.util.UUID

通过阅读几篇文章和博客,我有点困惑。我想知道如果两个Android设备都使用这个Java类(java.util.UUID)创建uuid,那么它们是否唯一,或者是否有重复的可能性?

此外,在某些设备上,我无法使用android.os.Build.SERIAL找到序列号。是否有替代方法可以获取设备的序列号?

2个回答

9
假设您正在使用 java.util.UUID 的 randomUUID() 函数,理论上存在重复的可能性,但这种可能性非常小。生成的 ID 是 RFC4122 版本 4 的 ID,其中有 122 位随机设置。这意味着有 5.32 x 10^^36 种可能的值。为了更好地理解,如果您有十亿台设备,每秒生成十亿个 ID,它们需要大约 1680 亿年才能完成(约为宇宙年龄的 10 倍)。因此,是的,重复是有可能发生的,但是(假设 Java 使用高质量的随机数生成器),它实际发生的几率非常小,可以忽略不计。

变得更清晰,你的意思是在现实世界方面,重复的机会可以忽略不计,对吗? - edwin
1
是的。请参考https://dev59.com/FnE85IYBdhLWcg3w_I38。 - broofa

1

获取设备ID使用Telephoney,您可以在此处使用它

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;
} 

这个设备 ID 和设备序列号是一样的吗?这段代码能在平板电脑上运行吗?(很遗憾我没有平板电脑来进行测试) - edwin
1
不同的事情,它们都被加起来以解决UUID中的冲突(如果有的话) 是的,它将在平板电脑上工作 尚未测试,但它是通用的 除了“getSimSerialNumber()”之外,您可以添加许多其他参数,还有很多其他功能。 - Usman Kurd
但是在CDMA设备的情况下,“getSimSerialNumber()”将返回空值(我在许多文章中读到,一些平板设备也会对此方法返回空值)。 - edwin
你有没有检查过这个方法 "android.os.Build"?是否有保证这个方法总是会返回值(在某些设备上我得到了 "unknown" 作为结果)? - edwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接