Задать вопрос
@AKLZephyr

Быстрое преобразование строки в uuid?

На входе может быть строка 2х форматов (с дефисами и без). Пример:
1) 34956bbb22644e8ab7112755254fb44d
2) 34956bbb-2264-4e8a-b711-2755254fb44d

Нужно: если приходит строка без дефисов преобразовать чтобы была с ними, как №2, а если с дефисами, то вернуть ее. Максимально быстро.

Сейчас использую пакет Ramsey\Uuid.
Ramsey\Uuid\Uuid::fromString($string)->toString()
Но на больших объемах преобразование медленное.

Написал простой вариант:
<?php

$s1 = '34956bbb22644e8ab7112755254fb44d';
$s2 = '34956bbb-2264-4e8a-b711-2755254fb44d';

function parse($string) {
    $len = strlen($string);

    if ($len === 36) {
        return $string;
    } elseif ($len === 32) {
        $components = [
            substr($string, 0, 8),
            substr($string, 8, 4),
            substr($string, 12, 4),
            substr($string, 16, 4),
            substr($string, 20)
        ];

        return implode('-', $components);
    } else {
        throw new \Exception('Invalid string.');
    }
}

echo parse($s1);
echo PHP_EOL;
echo parse($s2);


Есть более быстрый вариант?
  • Вопрос задан
  • 1372 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
я бы чуть ускорил, убрав лишнее
<?php
$string = '34956bbb22644e8ab7112755254fb44d';

function split1($string)
{
    $components = [
        substr($string, 0, 8),
        substr($string, 8, 4),
        substr($string, 12, 4),
        substr($string, 16, 4),
        substr($string, 20)
    ];

    return implode('-', $components);
}

function split2($string)
{
    return substr($string, 0, 8) . '-' .
        substr($string, 8, 4) . '-' .
        substr($string, 12, 4) . '-' .
        substr($string, 16, 4) . '-' .
        substr($string, 20);
}

function benchmark($max, $func, $string)
{
    $timer = [
        'start' => microtime(true),
        'stop' => false
    ];
    $i = 0;
    do {
        $i++;
        $func($string);

    } while ($i < $max);
    $timer['stop'] = microtime(true);
    printf("benchmark %s %s seconds\n", $func, $timer['stop'] - $timer['start']);
}

benchmark(10e6, 'split1', $string);
benchmark(10e6, 'split2', $string);

benchmark split1 6.28813123703 seconds
benchmark split2 5.1870620250702 seconds
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы