生成64位数字(作为十六进制字符串)

时间:2014-02-02 04:09:10

标签: php

我正在专门阅读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

4 个答案:

答案 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));
    }
}

参考:

http://php.net/manual/en/function.random-bytes.php

http://php.net/manual/en/function.mcrypt-create-iv.php