@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);


Есть более быстрый вариант?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Технология Тюмень
от 50 000 до 130 000 ₽
Директ Кредит Казань
от 70 000 до 120 000 ₽
Drom.ru Владивосток
от 100 000 до 150 000 ₽
06 авг. 2020, в 01:23
5000 руб./за проект
05 авг. 2020, в 21:55
20000 руб./за проект
05 авг. 2020, в 20:58
10000 руб./за проект