dsadsa - PHP Online

Form of PHP Sandbox

Enter Your PHP code here for testing/debugging in the Online PHP Sandbox. As in the usual PHP files, you can also add HTML, but do not forget to add the tag <?php in the places where the PHP script should be executed.



Your result can be seen below.

Result of php executing





Full code of dsadsa.php

  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5.  
  6. namespace Kyoto\Sandbox;
  7.  
  8. use InvalidArgumentException;
  9.  
  10. final class IDGenerator
  11. {
  12.     /**
  13.      * @var string[]
  14.      */
  15.     private array $alphabet = [
  16.         '0', '1', '2', '3', '4', '5', '6', '7', '8',
  17.         '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  18.         'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
  19.         'V', 'W', 'X', 'Y', 'Z'
  20.     ];
  21.  
  22.     /**
  23.      * @var string[]
  24.      */
  25.     private array $checksumAlphabet = [
  26.         '*', '$', '=', '@', '&', '%'
  27.     ];
  28.  
  29.     public function generate(string $bytes): string
  30.     {
  31.         $bin = gmp_strval(gmp_import($bytes), 2);
  32.         $bin = str_pad($bin, strlen($bytes) * 8, '0', STR_PAD_LEFT);
  33.         $bin = str_split($bin, 5);
  34.  
  35.         $last = array_pop($bin);
  36.         if (! is_null($last)) {
  37.             $bin[] = str_pad($last, 5, '0', STR_PAD_RIGHT);
  38.         }
  39.  
  40.         $encoded = implode(
  41.             '',
  42.             array_map(
  43.                 fn ($bits) => $this->getCharFromAlphabet(bindec($bits)),
  44.                 $bin
  45.             )
  46.         );
  47.         $checksum = $this->calculateChecksum($bytes);
  48.  
  49.         return $encoded . $this->getCharFromChecksumAlphabet($checksum);
  50.     }
  51.  
  52.     public function verify(string $id): bool
  53.     {
  54.         $calculatedChecksum = $this->calculateChecksum($this->decode($id));
  55.  
  56.         return $this->getCharFromChecksumAlphabet($calculatedChecksum) === $this->getChecksumCharFromId($id);
  57.     }
  58.  
  59.     public function decode(string $id): string
  60.     {
  61.         $normalizedId = $this->getIdWithoutChecksumChar($id);
  62.         $normalizedId = strtoupper($normalizedId);
  63.         $normalizedId = str_replace(['O', 'L', 'I', '-'], ['0', '1', '1', ''], $normalizedId);
  64.         $normalizedId = str_split($normalizedId);
  65.  
  66.         $bin = implode(
  67.             '',
  68.             array_map(
  69.                 fn ($char) => sprintf('%05b', array_search($char, $this->alphabet)),
  70.                 $normalizedId
  71.             )
  72.         );
  73.         $normalizedId = str_split($bin, 8);
  74.  
  75.         $last = array_pop($normalizedId);
  76.         if (! is_null($last) && strlen($last) === 8) {
  77.             $normalizedId[] = $last;
  78.         }
  79.  
  80.         return implode(
  81.             '',
  82.             array_map(
  83.                 fn ($bits) => chr(intval(bindec($bits))),
  84.                 $normalizedId
  85.             )
  86.         );
  87.     }
  88.  
  89.     private function calculateChecksum(string $bytes): int
  90.     {
  91.         $bigInt = gmp_strval(gmp_import($bytes));
  92.         $checksum = gmp_mod($bigInt, count($this->alphabet) + count($this->checksumAlphabet));
  93.  
  94.         return intval($checksum);
  95.     }
  96.  
  97.     private function getCharFromAlphabet(int $index): string
  98.     {
  99.         return $this->alphabet[$index] ?? throw new InvalidArgumentException(
  100.             'An array Index Out Of Bounds'
  101.         );
  102.     }
  103.  
  104.     private function getCharFromChecksumAlphabet(int $index): string
  105.     {
  106.         $mergedAlphabet = array_merge($this->alphabet, $this->checksumAlphabet);
  107.  
  108.         return $mergedAlphabet[$index] ?? throw new InvalidArgumentException(
  109.             'An array Index Out Of Bounds'
  110.         );
  111.     }
  112.  
  113.     private function getIdWithoutChecksumChar(string $id): string
  114.     {
  115.         return substr($id, 0, -1);
  116.     }
  117.  
  118.     private function getChecksumCharFromId(string $id): string
  119.     {
  120.         return substr($id, -1);
  121.     }
  122. }
File Description
  • dsadsa
  • PHP Code
  • 15 Sep-2023
  • 3.21 Kb
You can Share it: