2017-10-16 21 views
-3

J'ai un UUID dans mon système qui est 105cd680-a507-11e7-974e-b75d2751fd34.
Le problème est que lorsque j'ai envoyé cet UUID à un service Web, ils n'acceptent que les 30 caractères de l'UUID.Rendre l'UUID inférieur à 30 caractères

Une idée de la façon de convertir cela en 30 caractères et ensuite être en mesure de convertir en quelque sorte à la même longueur UUID?

En gros:

  1. Mon ID interne 105cd680-a507-11e7-974e-b75d2751fd34

  2. Quand j'ai envoyé au service Web que je veux convertir en quelque chose de 30 caractères.

  3. Quand je reçois la réponse en arrière, je veux que 30 ombles UUID convertir à nouveau mon ID interne 105cd680-a507-11e7-974e-b75d2751fd34
+5

Si c'est de 30 caractères, ce n'est pas un UUID, est-il? –

+2

Si chaque caractère dans l'UUID est vraiment aléatoire, il n'y a aucun moyen de convertir de 30 à votre longueur actuelle, parce que l'information aura été perdue. –

+0

@TimBiegeleisen c'est aléatoire! –

Répondre

1

Je ne vois pas quelque chose de mal avec juste prendre une sous-chaîne de l'UUID dans votre PHP code:

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

d'origine puis comment puis-je mapper ce sous-réseau à mon UUID? –

+0

Vous ne le faites pas, pour les raisons déjà évoquées. Si l'API utilise une chaîne UUID de 30 caractères, vous devez utiliser la même chose dans le code de votre application. –

+0

Avant de commenter, vérifiez l'autre réponse ... est-ce que votre API attend la base 64? –

2

UUID est représenté dans une chaîne hexadécimale. Vous pouvez le convertir en format base 64 en supprimant les tirets sans perdre aucune information. Lors de la conversion retour n'oubliez pas de réintroduire les quatre hypens et minuscules la chaîne, les détails sur le format are here.

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

+0

Cela suppose que l'API accepte la base 64. –

+0

Je ne voulais pas appeler l'API d'une base 64, je veux dire convertir la chaîne hexadécimale UUID en une chaîne UUID base64. Est toujours une chaîne donc rien ne doit être changé. – Phoenix

1

Il est une solution basée sur @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); 
} 

résultat sera:

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

chaîne Donc codé a 24 caractères, si vous voulez exactement 30 symboles que vous pouvez pad par symbole qui n'est pas utilisé pour l'encodage base64, disons *

donc le code ressemblera:

<?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); 
} 

Et il retournera:

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

Merci! Je ne suis pas un développeur PHP mais je pense être un bon penseur :) – Phoenix