<?php

function token($length = 32)
{
    // Create random token
    $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    $max = strlen($string) - 1;

    $token = '';

    for ($i = 0; $i < $length; $i++) {
        $token .= $string[mt_rand(0, $max)];
    }

    return $token;
}

/**
 * Backwards support for timing safe hash string comparisons
 *
 * http://php.net/manual/en/function.hash-equals.php
 */
if (!function_exists('hash_equals')) {

    function hash_equals($known_string, $user_string)
    {
        $known_string = (string)$known_string;
        $user_string = (string)$user_string;

        if (strlen($known_string) != strlen($user_string)) {
            return false;
        } else {
            $res = $known_string ^ $user_string;
            $ret = 0;

            for ($i = strlen($res) - 1; $i >= 0; $i--)
                $ret |= ord($res[$i]);

            return !$ret;
        }
    }

}

/**
 * Exception handler, to throw exception, when used on Warning.
 * https://stackoverflow.com/a/11206244/1720476
 */
if (!function_exists('copona_warning_handler')) {
    function copona_warning_handler($errno, $errstr) {
        throw new Exception("Error $errno:  $errstr") ;
    }
}

