PHP script for creating order numbers with checksum and prefix

I made these two functions to create order numbers with checksum and prefix.

It uses a predefined prefix "OLR" and a 2 digit checksum at the end of the order number. So if real identifier of an order is 1000 the order number will be OLR0100095

1000 => OLR0100095

prefix: OLR

order_id: 1000

checksum: 95



Other examples:

1 => OLR0000143

100 => OLR0010061

1000 => OLR0100095



Numbers above the 5 digit zero pre-filler will also work, but will extend the total number of the entire order number string.

<?php
   
/**
     * Create an order number with prefix and checksum
     * @param type $id
     * @return type
     */
   
function createOrderNumber($id, $prefix = "OLR"){
       
$base = $prefix.sprintf("%05d", $id);
       
$bignum = hexdec( substr(sha1($id), 0, 15) );
       
$checksum = sprintf("%02d", ($bignum % 99));
        return
$base.$checksum;
    }


   
/**
     * Validate a given order number
     * @param type $order_number
     * @param type $show_details
     * @return boolean OR explaining
     */
   
function validateOrderNumber($order_number, $show_details = FALSE, $prefix = "OLR"){
       
$checksum = substr($order_number, -2);
       
$order_id = (int) substr(str_replace($prefix, "", $order_number), 0, strlen($order_number)-(strlen($prefix))-2);
       
       
$control_order = createOrderNumber($order_id);
       
        if(
$control_order === $order_number) {
           
$valid = "yes";
           
$valid_bool = TRUE;
        }else{
           
$valid = "no";
        }
       
        if(
$show_details){
            return
"checksum: $checksum order_id: $order_id valid: $valid";
        }else{
            return
$valid_bool;
        }
    }
/**
* Test the functions
**/

$i = 1;
echo
"$i => ".createOrderNumber($i);
$validation = validateOrderNumber(createOrderNumber($i), TRUE);
echo
"$validation<br>";
$i = 100;
echo
"$i => ".createOrderNumber($i);
$validation = validateOrderNumber(createOrderNumber($i), TRUE);
echo
"$validation<br>";

for (
$i = 1000; $i < 1100; $i++){
   
$order_number = createOrderNumber($i);
   
$validation = validateOrderNumber($order_number, TRUE);
    echo
"$i => ".$order_number. " validation:".$validation;
   
    echo
"<br>";
}

//Out come of the test:
1 => OLR0000143checksum: 43 order_id: 1 valid: yes
100
=> OLR0010061checksum: 61 order_id: 100 valid: yes
1000
=> OLR0100095 validation:checksum: 95 order_id: 1000 valid: yes
1001
=> OLR0100193 validation:checksum: 93 order_id: 1001 valid: yes
1002
=> OLR0100200 validation:checksum: 00 order_id: 1002 valid: yes
1003
=> OLR0100305 validation:checksum: 05 order_id: 1003 valid: yes
1004
=> OLR0100461 validation:checksum: 61 order_id: 1004 valid: yes
1005
=> OLR0100536 validation:checksum: 36 order_id: 1005 valid: yes
1006
=> OLR0100683 validation:checksum: 83 order_id: 1006 valid: yes
...etc
?>
Knowledge keywords: