使UUID少于30个字符

问题描述:

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

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

基本上是:

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

  2. 当我发送到Web服务,我要转换的东西30个 字符。

  3. 当我得到的回应后,我想是30字符的UUID 再次转换为我的内部ID 105cd680-a507-11e7-974e-b75d2751fd34
+5

如果是30个字符,这不是一个UUID,是吗? –

+2

如果UUID中的每个字符都是真正随机的,那么就没有办法从30转换到当前长度,因为信息将会丢失。 –

+0

@TimBiegeleisen它是随机的! –

我看不出有什么毛病只是服用UUID的子串在你的PHP代码:

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

那么我怎样才能将它映射回我的UUID? –

+0

你没有,因为已经讨论过的原因。如果API使用30个字符的UUID字符串,则应该在您的应用程序代码中使用相同的字符。 –

+0

在我进一步评论之前,请检查其他答案......您的API期望基数为64吗? –

UUID用十六进制字符串表示。您可以将其转换为基本的64格式,而不会丢失任何信息。在将其转换回来时,请记住重新引入四个超文本字符串和小写字符串,详细了解format are here

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

+0

这里假设API接受base 64. –

+0

我不想以base 64的方式调用api,我的意思是将UUID hex字符串转换为UUID base64字符串。总是一个字符串,所以没有必要改变。 – Phoenix

有基于@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" 
+0

谢谢!我不是一个PHP开发人员,但我认为是一个好思想家:) – Phoenix