使UUID小于30个字符

时间:2017-10-16 07:09:42

标签: php uuid

我的系统中有一个105cd680-a507-11e7-974e-b75d2751fd34长的UUID 问题是当我将这个UUID发送到Web服务时,他们只接受UUID的30个字符长。

任何想法如何将此转换为30个字符,然后能够以某种方式将其转换为相同长度的UUID?

基本上:

  1. 我的内部ID 105cd680-a507-11e7-974e-b75d2751fd34

  2. 当我发送到网络服务时,我希望转换为30     字符。

  3. 当我得到回复时,我想要30个字符转换     再次作为我的内部ID 105cd680-a507-11e7-974e-b75d2751fd34

3 个答案:

答案 0 :(得分:2)

UUID以十六进制字符串表示。您可以将其转换为基本64格式,删除连字符而不会丢失任何信息。将其转换回去时,请记住重新引入四个超大小写的字符串,详细信息请参见format are here

Here one online converter from hex to base64 and from base64 to hex

答案 1 :(得分:1)

我在PHP代码中只带了一个UUID的子字符串,看不出有什么问题:

$uuid = "105cd680-a507-11e7-974e-b75d2751fd34";
$new_uid = substr($uuid, 0, 30);

答案 2 :(得分:1)

有基于@Phoenix idea的解决方案:

<?php
$g = "105cd680-a507-11e7-974e-b75d2751fd34";

$e = encodeGUID($g);
var_dump($e);
$ge = decodeGUID($e);
var_dump($ge);

function encodeGUID($g)
{
    $t = str_replace("-", "", $g);
    return base64_encode(pack("h*", $t));
}

function decodeGUID($g)
{
    $g = implode('', unpack("h*", base64_decode($g)));
    return substr($g, 0, 8) . '-' . substr($g, 8, 4) . '-' . substr($g, 12, 4)
        . '-' . substr($g, 16);
}

结果将是:

string(24) "AcVtCFpwEX555HvVchXfQw=="
string(35) "105cd680-a507-11e7-974eb75d2751fd34"

所以编码的字符串有24个字符,如果你想要30个符号,你可以用不用于base64编码的符号填充它,让我们说*

所以代码看起来像:

<?php
$g = "105cd680-a507-11e7-974e-b75d2751fd34";

$e = encodeGUID($g);
var_dump($e);
$ge = decodeGUID($e);
var_dump($ge);

function encodeGUID($g)
{
    $t = str_replace("-", "", $g);
    $e = base64_encode(pack("h*", $t));
    return str_pad(base64_encode(pack("h*", $t)), 30, "*");
}

function decodeGUID($g)
{
    $g = implode('', unpack("h*", base64_decode(trim($g, ' *'))));
    return substr($g, 0, 8) . '-' . substr($g, 8, 4) . '-' . substr($g, 12, 4)
        . '-' . substr($g, 16);
}

它将返回:

string(30) "AcVtCFpwEX555HvVchXfQw==******"
string(35) "105cd680-a507-11e7-974eb75d2751fd34"