PHP:如何将UUID转换为字节?

时间:2018-03-21 15:10:41

标签: php postgresql

所以在这个项目中,我正在研究我目前正在尝试执行一个重置密码功能,该功能会生成一个URL,然后将一个附加到其上的秘密提供给用户,以便在后端。

问题是秘密需要以bytea格式存储在db(postgresql)中。有没有办法在PHP中将UUID转换为bytea格式?我尝试了一些不同的打包和打包变体以及我在网站上发现的一些功能但没有成功。

我不允许以任何方式更改数据库。

2 个答案:

答案 0 :(得分:2)

你可以从Ramsey \ Uuid \ Uuid对象中获取这样的字节:

$uuid = \Ramsey\Uuid\Uuid::uuid4();
$bytes = $uuid->getBytes();

答案 1 :(得分:1)

FWIW,这就是我所做的(MySQL上下文):

/**
 *
 * pack with H* to ensure compatibility with MySQL function UNHEX.
 *
 * @param string $stringGuid
 *
 * @return string 16 bytes long
 *
 * @ref https://stackoverflow.com/questions/2839037/php-mysql-storing-and-retrieving-uuids
 */
function stringGuidAsBinaryGuid($stringGuid)
{
    $binary = pack("H*" , str_replace('-' , '' , $stringGuid));
    return $binary;
}

function binaryGuidAsStringGuid($binaryGuid)
{
    $string = unpack("H*" , $binaryGuid);
    $string = preg_replace(
        "/([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})/" ,
        "$1-$2-$3-$4-$5" ,
        $string["1"]
    );
    return $string;
}

/***
 *
 * returns a valid GUID, v4 (string, 36 bytes)
 *
 * @link http://php.net/manual/en/function.com-create-guid.php
 *
 * @return string
 *
 */
function GUID()
{

    // prefer strong crypto variant

    if (function_exists('openssl_random_pseudo_bytes') === true) {
        $data    = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);    // set version to 0100
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);    // set bits 6-7 to 10
        return vsprintf('%s%s-%s-%s-%s-%s%s%s' , str_split(bin2hex($data) , 4));
    }

    return sprintf(
        '%04X%04X-%04X-%04X-%04X-%04X%04X%04X' ,
        mt_rand(0 , 65535) ,
        mt_rand(0 , 65535) ,
        mt_rand(0 , 65535) ,
        mt_rand(16384 , 20479) ,
        mt_rand(32768 , 49151) ,
        mt_rand(0 , 65535) ,
        mt_rand(0 , 65535) ,
        mt_rand(0 , 65535)
    );

}