我正在专门阅读android文档http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID。
我想模拟这个函数在PHP中生成一个android_id值,以便稍微使用 测试脚本。似乎所有值都是16个字符长和字母数字。我希望我的价值完全有效,而不是只生成一个字母数字16字符串。任何想法都将不胜感激。
根据Tom的贡献,有人可以确认代码,
BIN2HEX(openssl_random_pseudo_bytes(8));
会返回一个完全有效的android_id
答案 0 :(得分:5)
你的意思是这样吗?
$id = bin2hex(openssl_random_pseudo_bytes(8));
它生成64位随机数的十六进制表示。
答案 1 :(得分:2)
有效的十六进制字符串仅包含A到F的数字和字母。例“014AEC092FA74D78”。
答案 2 :(得分:2)
现在这可能正是你想要的,但我想将其发布到SO,因为我无法通过快速搜索在其他任何地方找到它。 以下是来自SettingsProvider包的代码,实际为设备生成ANDROID_ID。
private boolean ensureAndroidIdIsSet() {
final Cursor c = query(Settings.Secure.CONTENT_URI,
new String[] { Settings.NameValueTable.VALUE },
Settings.NameValueTable.NAME + "=?",
new String[] { Settings.Secure.ANDROID_ID }, null);
try {
final String value = c.moveToNext() ? c.getString(0) : null;
if (value == null) {
final SecureRandom random = new SecureRandom();
final String newAndroidIdValue = Long.toHexString(random.nextLong());
Log.d(TAG, "Generated and saved new ANDROID_ID [" + newAndroidIdValue + "]");
final ContentValues values = new ContentValues();
values.put(Settings.NameValueTable.NAME, Settings.Secure.ANDROID_ID);
values.put(Settings.NameValueTable.VALUE, newAndroidIdValue);
final Uri uri = insert(Settings.Secure.CONTENT_URI, values);
if (uri == null) {
return false;
}
}
return true;
} finally {
c.close();
}
}
鉴于这个功能,它可以像杰克和其他人指出的那样在PHP中轻松模拟。您只是创建一个64位随机数并将其存储为十六进制字符串。有很多方法可以实现这一点,所以我将把这部分留给读者。
答案 3 :(得分:1)
可以使用PHP 7:
$id = bin2hex(random_bytes(8));
或 (PHP 4,PHP 5,PHP 7< 7.2.0,PECL mcrypt> = 1.0.0)
$id = bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
使用示例:
function RandomToken($length = 32){
if(!isset($length) || intval($length) <= 8 ){
$length = 32;
}
if (function_exists('random_bytes')) {
return bin2hex(random_bytes($length));
}
if (function_exists('mcrypt_create_iv')) {
return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
}
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes($length));
}
}
参考: