如何在 PHP 中创建唯一键值?

发布于 2024-08-24 17:01:04 字数 62 浏览 5 评论 0原文

如何在 PHP 中创建唯一的键值?

我需要长度为 20 位(不超过 33 位)的简单唯一密钥。

How do I create unique key value in PHP?

I need simple unique keys with a length of 20 digits (not more than 33).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

ゃ人海孤独症 2024-08-31 17:01:04

您正在寻找加密密钥吗?

请勿在涉及安全的任何环境中使用 uniqid()。在这种情况下使用它的可预测性太高了。

PEAR::Crypt_RSA 包允许您在 PHP 中生成加密强密钥。一旦安装在本地 PEAR 安装中,您就可以使用它来生成密钥,如下所示:

require_once 'Crypt/RSA.php';

// Creates a 96-bit key, which is 24 hex chars long
$key_pair = new Crypt_RSA_KeyPair(96);

//Returns public key from the pair
$public_key = $key_pair->getPublicKey();

//Returns private key from the pair
$private_key = $key_pair->getPrivateKey();

UUID 也可能对您的目标有好处。下面是一个将在所有系统上生成符合标准的 UUID 的类:

<?php

/**
 * UUID generator class
 *
 * Generates valid RFC 4211 compliant Universally Unique IDentifiers (UUID) version 3, 4 and 5. 
 * UUIDs generated validate using the OSSP UUID Tool, and the output for named-based UUIDs are 
 * exactly the same. This is a pure PHP implementation.
 *
 * Usage:
 * 
 *   Name-based UUID:
 *
 *     $v3uuid = UUID::v3('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');
 *     $v5uuid = UUID::v5(UUID::NS_URL, 'http://www.google.com/');
 *
 *   Pseudo-random UUID:
 *
 *     $v4uuid = UUID::v4();
 *
 *
 * Originally found at: http://www.php.net/manual/en/function.uniqid.php#94959
 *
 * @author Andrew Moore 
 *
 *
 * Modifications made by Henry Merriam <[email protected]> on 2009-12-20:
 *
 *   + Added constants for predefined namespaces as defined in RFC 4211 Appendix C.
 *     + NS_DNS
 *     + NS_URL
 *     + NS_ISO_UID
 *     + NS_X500_DN
 *
 *   + Wrote this documentation comment.
 *
 */
class UUID {

    const NS_DNS     = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; // FQDN
    const NS_URL     = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; // URL
    const NS_ISO_OID = '6ba7b812-9dad-11d1-80b4-00c04fd430c8'; // ISO OID
    const NS_X500_DN = '6ba7b814-9dad-11d1-80b4-00c04fd430c8'; // X.500 DN (in DER or a text output format)

    public static function v3($namespace, $name) {

        if(!self::is_valid($namespace)) return false;

        // Get hexadecimal components of namespace
        $nhex = str_replace(array('-','{','}'), '', $namespace);

        // Binary Value
        $nstr = '';

        // Convert Namespace UUID to bits
        for($i = 0; $i < strlen($nhex); $i+=2) {
            $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
        }

        // Calculate hash value
        $hash = md5($nstr . $name);

        // Format and return UUID
        return sprintf('%08s-%04s-%04x-%04x-%12s',

            // 32 bits for "time_low"
            substr($hash, 0, 8),

            // 16 bits for "time_mid"
            substr($hash, 8, 4),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 3
            (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

            // 48 bits for "node"
            substr($hash, 20, 12)
        );

    }

    public static function v4() {

        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

            // 32 bits for "time_low"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff),

            // 16 bits for "time_mid"
            mt_rand(0, 0xffff),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 4
            mt_rand(0, 0x0fff) | 0x4000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            mt_rand(0, 0x3fff) | 0x8000,

            // 48 bits for "node"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
        );

    }

    public static function v5($namespace, $name) {

        if(!self::is_valid($namespace)) return false;

        // Get hexadecimal components of namespace
        $nhex = str_replace(array('-','{','}'), '', $namespace);

        // Binary Value
        $nstr = '';

        // Convert Namespace UUID to bits
        for($i = 0; $i < strlen($nhex); $i+=2) {
            $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
        }

        // Calculate hash value
        $hash = sha1($nstr . $name);

        // Format and return UUID
        return sprintf('%08s-%04s-%04x-%04x-%12s',

            // 32 bits for "time_low"
            substr($hash, 0, 8),

            // 16 bits for "time_mid"
            substr($hash, 8, 4),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 5
            (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

            // 48 bits for "node"
            substr($hash, 20, 12)
        );

    }

    public static function is_valid($uuid) {
        return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
            '[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
    }

}

不要在涉及安全的任何上下文中使用 uniqid()。在这种情况下使用它太容易预测了。

You are looking for an encryption key?

Do not use uniqid() in any context where security is involved. It is too predictable to be used in such context.

The PEAR::Crypt_RSA package allows you to generate cryptographically strong keys in PHP. Once installed in your local PEAR install, you may use it to generate a key as follows:

require_once 'Crypt/RSA.php';

// Creates a 96-bit key, which is 24 hex chars long
$key_pair = new Crypt_RSA_KeyPair(96);

//Returns public key from the pair
$public_key = $key_pair->getPublicKey();

//Returns private key from the pair
$private_key = $key_pair->getPrivateKey();

UUID's may also be good for your goal. Here is a class which will generate standard-compliant UUIDs on all systems:

<?php

/**
 * UUID generator class
 *
 * Generates valid RFC 4211 compliant Universally Unique IDentifiers (UUID) version 3, 4 and 5. 
 * UUIDs generated validate using the OSSP UUID Tool, and the output for named-based UUIDs are 
 * exactly the same. This is a pure PHP implementation.
 *
 * Usage:
 * 
 *   Name-based UUID:
 *
 *     $v3uuid = UUID::v3('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');
 *     $v5uuid = UUID::v5(UUID::NS_URL, 'http://www.google.com/');
 *
 *   Pseudo-random UUID:
 *
 *     $v4uuid = UUID::v4();
 *
 *
 * Originally found at: http://www.php.net/manual/en/function.uniqid.php#94959
 *
 * @author Andrew Moore 
 *
 *
 * Modifications made by Henry Merriam <[email protected]> on 2009-12-20:
 *
 *   + Added constants for predefined namespaces as defined in RFC 4211 Appendix C.
 *     + NS_DNS
 *     + NS_URL
 *     + NS_ISO_UID
 *     + NS_X500_DN
 *
 *   + Wrote this documentation comment.
 *
 */
class UUID {

    const NS_DNS     = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; // FQDN
    const NS_URL     = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; // URL
    const NS_ISO_OID = '6ba7b812-9dad-11d1-80b4-00c04fd430c8'; // ISO OID
    const NS_X500_DN = '6ba7b814-9dad-11d1-80b4-00c04fd430c8'; // X.500 DN (in DER or a text output format)

    public static function v3($namespace, $name) {

        if(!self::is_valid($namespace)) return false;

        // Get hexadecimal components of namespace
        $nhex = str_replace(array('-','{','}'), '', $namespace);

        // Binary Value
        $nstr = '';

        // Convert Namespace UUID to bits
        for($i = 0; $i < strlen($nhex); $i+=2) {
            $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
        }

        // Calculate hash value
        $hash = md5($nstr . $name);

        // Format and return UUID
        return sprintf('%08s-%04s-%04x-%04x-%12s',

            // 32 bits for "time_low"
            substr($hash, 0, 8),

            // 16 bits for "time_mid"
            substr($hash, 8, 4),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 3
            (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

            // 48 bits for "node"
            substr($hash, 20, 12)
        );

    }

    public static function v4() {

        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

            // 32 bits for "time_low"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff),

            // 16 bits for "time_mid"
            mt_rand(0, 0xffff),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 4
            mt_rand(0, 0x0fff) | 0x4000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            mt_rand(0, 0x3fff) | 0x8000,

            // 48 bits for "node"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
        );

    }

    public static function v5($namespace, $name) {

        if(!self::is_valid($namespace)) return false;

        // Get hexadecimal components of namespace
        $nhex = str_replace(array('-','{','}'), '', $namespace);

        // Binary Value
        $nstr = '';

        // Convert Namespace UUID to bits
        for($i = 0; $i < strlen($nhex); $i+=2) {
            $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
        }

        // Calculate hash value
        $hash = sha1($nstr . $name);

        // Format and return UUID
        return sprintf('%08s-%04s-%04x-%04x-%12s',

            // 32 bits for "time_low"
            substr($hash, 0, 8),

            // 16 bits for "time_mid"
            substr($hash, 8, 4),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 5
            (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

            // 48 bits for "node"
            substr($hash, 20, 12)
        );

    }

    public static function is_valid($uuid) {
        return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
            '[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
    }

}

Do not use uniqid() in any context where security is involved. It is too predictable to be used in such context.

删除会话 2024-08-31 17:01:04

尝试 uniqid() http://php.net/manual/en/function.uniqid。 php

如果您可以使用 pecl,您可以尝试此模块:http://pecl.php。 net/package/uuid

如果你在网络服务器中使用 Ubuntu,还有一些东西: http://code.google.com/p/php-uuid/

Try uniqid() http://php.net/manual/en/function.uniqid.php

If you can use pecl you can try this module: http://pecl.php.net/package/uuid

Theres also something if you use Ubuntu in your web server: http://code.google.com/p/php-uuid/

小兔几 2024-08-31 17:01:04

使用 uniqueid()

string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )

虽然如果它是唯一的,我不知道为什么你有最小长度要求。

Use uniqueid()

string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )

Although if it's unique, I don't know why you have a minimum length requirement.

孤城病女 2024-08-31 17:01:04

代码

$rand_val = md5(uniqid() + mt_rand());

文档
mt_rand()
md5
uniqid

免责声明
理论上存在碰撞的可能性,但可能性不大。 uniqidmt_rand() 应该使它对于可能的用途来说足够难以猜测。尽管这会产生 32 个字符长的字符串。

(根据建设性意见进行编辑)

Code

$rand_val = md5(uniqid() + mt_rand());

Doc
mt_rand()
md5
uniqid

Disclaimer
There is a theoretical chance of collision, but not likely. The combination of uniqid and mt_rand() should make it unguessable enough for what ever use there may be. Though this results in a 32 char long string.

(Edited after constructive comments)

少女七分熟 2024-08-31 17:01:04

这将为您创建一个至少 20 个字符长的唯一 ID

$id = '';
while(strlen($id) < 20)
{
   $id .= uniqid();
}

this will create a unique id for you which is at least 20 chars long

$id = '';
while(strlen($id) < 20)
{
   $id .= uniqid();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文