PHP code example of pvmlibs / flexid

1. Go to this page and download the library: Download pvmlibs/flexid library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

pvmlibs / flexid example snippets


// just generate some unique ID
$generator = new \Pvmlibs\FlexId\FlexIdGenerator(
    workerResolver: new \Pvmlibs\FlexId\Resolvers\RedisTimestepWorkerResolver(client: $redisClient)
);

$generator->id(); // 43526598068356096

// static worker id, uses process PID as worker id as example
$generator = new \Pvmlibs\FlexId\(
                workerResolver: new \Pvmlibs\FlexId\Resolvers\StaticWorkerResolver(
                    workerHandlerFn: fn () => getmypid(), workersBits: 8, sequenceBits: 8
                )
            );
$generator->id(); // 43524358613175296

$ids = $generator->bulkIds(1000); // array

$generator = new \Pvmlibs\FlexId\FlexIdGenerator(
    workerResolver: new \Pvmlibs\FlexId\Resolvers\RedisTimestepWorkerResolver(client: $redisClient)
);

$serializer = new \Pvmlibs\FlexId\Serializers\HashSerializer();

// using helper container
$encodedId = new \Pvmlibs\FlexId\IdHandlers\EncodedId(
   serializer: $serializer,
   // signer: use SignerContract if id should be also signed
   generator: $generator, // optional, if you want to generate id
);

$id = $encodedId->generateId(); // 43581127276918784
$publicId = $encodedId->toPublicId($id); // LNvqjBKLnJ
$encodedId->fromPublicId($publicId); // 43581127276918784

// or use serializer directly
$id = $generator->id(); // 43581127276918784
$publicId = $serializer->serialize($id); // LNvqjBKLnJ
$serializer->serialize($publicId); // 43581127276918784

$generator = new \Pvmlibs\FlexId\FlexIdGenerator(
    workerResolver: new \Pvmlibs\FlexId\Resolvers\RedisTimestepWorkerResolver(client: $redisClient)
);
$secret = \Pvmlibs\FlexId\Encrypters\Sparx64Encrypter::generateSecret(); // use your own secret
$encrypter = new \Pvmlibs\FlexId\Encrypters\Sparx64Encrypter(
    secret: $secret,
    serializer: new \Pvmlibs\FlexId\Serializers\BaseSerializer()
);

// using helper container
$encryptedId = new \Pvmlibs\FlexId\IdHandlers\EncryptedId(
    encrypter: $encrypter,
    // signer: use SignerContract if id should be also signed
    generator: $generator, // optional, if you want to generate id
);

$id = $encryptedId->generateId(); // 43581127276918784
$publicId = $encryptedId->toPublicId($id); // yVyKqbkQDgYgR
$encryptedId->fromPublicId($publicId); // 43581127276918784

// or use encryptor directly
$id = $generator->id(); // 43581127276918784
$publicId = $encrypter->encrypt($id,''); // yVyKqbkQDgYgR
$encrypter->decrypt($publicId); // 43581127276918784

// use signer as id crc, 1 char sign
$signer = new \Pvmlibs\FlexId\Signers\Signer(
    secret: \Pvmlibs\FlexId\Signers\Signer::generateSecret(), // use your own key
    serializer: new \Pvmlibs\FlexId\Serializers\CustomSerializer(),
    hashAlgo: 'siphash-2-4', // siphash is few times faster than sha256
    maxSignLength: 1,
    onlyPositiveRange: true // optionally for short signs, much faster when using with CustomSerializer
);

$id = 'r8BnZxS';
$signed = $signer->getSignedId($id); // r8BnZxSQ
// get id from signed with validation
$id = $signer->getIdFromSigned($signed); // r8BnZxS

// for more integrity assurance use longer sign length (signBits). For shorter output and less assurance adjust maxSignLength.
$signer = new \Pvmlibs\FlexId\Signers\Signer(
    secret: \Pvmlibs\FlexId\Signers\Signer::generateSecret(), // use your own key
    serializer: new \Pvmlibs\FlexId\Serializers\BaseSerializer(),
    hashAlgo: 'siphash-2-4',
    signBits: 64,
);

$id = 'r8BnZxS';
$signed = $signer->getSignedId($id); // r8BnZxSDwJgwJWVxfJdx

// other examples of signed id
// encrypted id + default 64-bit sign
// r8BnZxSqxFfPZYcLLYzQ
// encrypted id + 128-bit sign
// r8BnZxSqxFfPZYcLLYzQJZMcRWcLqmvLD

// base class for reuse
abstract class IdBaseHandler {
    use \Pvmlibs\FlexId\Concerns\HasIdHandler;

    // implement method returning IdHandlerContract[]
    protected static function getIdHandler(): array
    {
        static $class = null;
        $class ??= [
            // adjust for your needs, add another classes for e.g. key rotation
            new \Pvmlibs\FlexId\IdHandlers\EncodedId(serializer: new \Pvmlibs\FlexId\Serializers\HashSerializer()),
        ];
        return $class;
    }
    
    // called when cannot decode public id
    protected static function handleFromPublicIdException(\Exception $exception): void
    {
        throw $exception; // or e.g. throw 403
    }
}

class IdVO extends IdBaseHandler {
    protected static function idUniqueTypeName(): string
    {
        return 'foo';
    }
}


$idVO = new IdVO(internalId: 10);
echo $idVO->getPublicId(); // 1N1x
echo IdVO::fromPublicId('1N1x')->getInternalId(); // 10 

$generator->idInTime(1779275145863184)) // 43585545820962816
bash
php vendor/pvmlibs/flexid/src/Scripts/bench.php [--dist --info]
# this is more detailed
php vendor/pvmlibs/flexid/src/Scripts/perf.php