ตรวจสอบสตริง base64

วัดประสิทธิภาพ

เมื่อมีฟังก์ชั่นที่เขียนขึ้นมาทั้ง 3 และใช้งานได้แล้ว ก็มาเขียนโค้ดสำหรับทดสอบ โดยชุดสตริงที่จะทดสอบจะต้องประกอบไปด้วยข้อมูลเหล่านี้

$strings = array(
    'NTU1NQ==' => true,
    'dGVzdA==' => true,
    'aGVsbG8=' => true,
    '4Liq4Lin4Lix4Liq4LiU4Li1' => true,
    '5555' => false,
    'test' => false,
    'hello' => false,
    'สวัสดี' => false,
)

ซึ่ง key ของ array จะมีสตริง base64 ที่ถูกต้องและไม่ถูกต้องปนกันไป. ค่าของ array จะเป็นการคาดหมายว่าข้อมูลนี้จะถูกต้อง (true) หรือไม่ถูกต้อง (false). และนอกจากนี้สามารถสร้าง string แบบสุ่มขึ้นมาชุดละ 20 ตัวอักษร เป็นภาษาอังกฤษและตัวเลข จำนวน 100 รายการ ซึ่งจะเป็นสตริง base64 ที่ไม่ถูกต้องทั้งหมด เพื่อทดสอบประสิทธิภาพของโค้ดที่ใช้ตรวจ. จากนั้นใช้โค้ดตรวจสอบดังต่อไปนี้.

<?php

// function isValidBase64 อยู่ตรงนี้

assert_options(ASSERT_BAIL, 1);

// debug functions. -------------------------------
/**
 * Human readable file size.
 *
 * @link https://stackoverflow.com/a/15188082/128761
 * @param int $size
 * @param string $unit
 * @return string
 */
function humanFileSize($size, $unit = "")
{
    if ((!$unit && $size >= 1 << 30) || $unit == "GB")
        return number_format($size / (1 << 30), 2) . " GB";
    if ((!$unit && $size >= 1 << 20) || $unit == "MB")
        return number_format($size / (1 << 20), 2) . " MB";
    if ((!$unit && $size >= 1 << 10) || $unit == "KB")
        return number_format($size / (1 << 10), 2) . " KB";
    return number_format($size) . " bytes";
}


function indent($num = 1)
{
    return str_repeat('&nbsp; &nbsp; ', $num);
}


function printBenchmark($timeStart = 0)
{
    $timeEnd = microtime(true);
    $executionTime = ($timeEnd - $timeStart);
    unset($timeEnd);
    $memoryUse = memory_get_peak_usage();

    echo 'PHP version: ' . PHP_VERSION . '<br>' . PHP_EOL;
    echo 'execution time: ' . $executionTime . ' seconds.<br>' . PHP_EOL;
    echo 'memory usage: ' . humanFileSize($memoryUse) . '.<br>' . PHP_EOL;

    $backTrace = debug_backtrace();
    $callerFile = ($backTrace[0]['file'] ? basename($backTrace[0]['file']) : __FILE__);
    unset($backTrace);
    echo 'file: ' . $callerFile . '<br>' . PHP_EOL;

    if (!is_dir('logs')) {
        mkdir('logs');
    }
    file_put_contents(
        'logs/' . basename($callerFile) . '.txt', 
        PHP_VERSION . "\t" . $executionTime . "\t" . $memoryUse . PHP_EOL,
        FILE_APPEND
    );
    writePHPLog($executionTime, $memoryUse, $callerFile);
}


function writePHPLog($executionTime, $memoryUse, $callerFile)
{
    $output = '';
    $logFile = 'logs/' . $callerFile;

    if (!is_file($logFile)) {
        $openPHP = true;
    } else {
        $contents = file_get_contents($logFile);
        if (stripos($contents, '<?php') === false) {
            $openPHP = true;
        }
    }

    if (isset($openPHP) && $openPHP === true) {
        $output .= '<?php' . PHP_EOL . PHP_EOL;
        $output .= '$log = [];' . PHP_EOL;
    }
    unset($openPHP);

    $output .= '$log[\'' . PHP_VERSION . '\'][] = [\'t\' => ' . $executionTime . ', \'m\' => ' . $memoryUse . ',];' . PHP_EOL;
    file_put_contents($logFile, $output, FILE_APPEND);
}
// end debug functions. ---------------------------------


$timeStart = microtime(true);
// $strings = array(...);// ข้อมูลใช้ทดสอบอยู่ตรงนี้
foreach ($strings as $string => $assert) {
    $decoded = base64_decode($string);
    $isValid = isValidBase64($string);
    echo '<strong>' . $string . '</strong> decoded: ' . str_replace(['<', '>'], ['&lt;', '&gt;'], (var_export($decoded, true))) . '<br>' . PHP_EOL;
    echo indent() . 'is valid: ' . ($isValid === true ? '<span style="color: green;">YES</span>' : '<span style="color: red;">NO</span>') . '<br>' . PHP_EOL;
    assert($isValid === $assert, 'Failed assert for ' . $string);
}
echo '<br>' . PHP_EOL;

printBenchmark($timeStart);

เมื่อทำการทดลองเรียกฟังก์ชั่นตรวจสอบแต่ละวิธี วิธีละ 3 ครั้ง โดยจากเครื่องที่ใช้ทดสอบนี้จะใช้ PHP 7.1, 7.4, 8.0 จะได้ผลลัพธ์ดังนี้

ผลการทดลองประสิทธิภาพ

htmlspecialchars

PHP เวลาที่ใช้ (วินาที) หน่วยความจำที่ใช้ (KB)
7.1.33 0.015239000320435 627.45
0.017446041107178 627.63
0.014214992523193 627.63
7.4.21 0.0085608959197998 663.47
0.008018970489502 663.59
0.0080010890960693 663.59
8.0.8 0.0081050395965576 663.56
0.00795578956604 663.69
0.0082218647003174 663.69

json_encode

7.1.33 0.01386284828186 627.08
0.013746976852417 627.25
0.014485120773315 627.25
7.4.21 0.0079169273376465 663.16
0.0079128742218018 663.29
0.0075619220733643 663.29
8.0.8 0.0077497959136963 663.26
0.0075399875640869 663.38
0.0083630084991455 663.38

mb_convert_encoding

7.1.33 0.018823146820068 627.13
0.017688035964966 627.30
0.017730951309204 627.30
7.4.21 0.011916160583496 663.10
0.011991024017334 663.23
0.011780023574829 663.23
8.0.8 0.0089950561523438 663.21
0.0089821815490723 663.34
0.0099000930786133 663.34

โดยสรุปพบว่า json_encode() ใช้ตรวจสอบ ทำความเร็วได้สูงสุดใน PHP ทุกรุ่น และตั้งแต่ที่ผู้เขียนได้ทดลองใช้มา ยังไม่พบข้อบกพร่องใดๆที่จะทำการตรวจสอบพลาด จึงอาจบอกได้ว่าวิธีนี้เป็นวิธีตรวจสอบว่าข้อมูล base64 ถูกเข้ารหัสแล้วหรือไม่ ได้ดีที่สุด.

สามารถเลือกใช้ซอร์สโค้ดในหน้านี้ได้ทุกจุดประสงค์หรือดาวน์โหลดจาก GitHub (Rundiz/Serializer) ผ่านปุ่มดาวน์โหลดด้านล่างนี้
ดาวน์โหลด

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>