php: number only hash?

后端 未结 7 1953
眼角桃花
眼角桃花 2020-12-03 01:00

In php is there a way to give a unique hash from a string, but that the hash was made up from numbers only?

example:

return md5(234); // returns 098f         


        
相关标签:
7条回答
  • 2020-12-03 01:30

    There are some good answers but for me the approaches seem silly.
    They first force php to create a Hex number, then convert this back (hexdec) in a BigInteger and then cut it down to a number of letters... this is much work!

    Instead why not

    Read the hash as binary:

    $binhash = md5('[input value]', true);
    

    then using

    $numhash = unpack('N2', $binhash); //- or 'V2' for little endian
    

    to cast this as two INTs ($numhash is an array of two elements). Now you can reduce the number of bits in the number simply using an AND operation. e.g:

    $result = $numhash[1] & 0x000FFFFF; //- to get numbers between 0 and 1048575
    

    But be warned of collisions! Reducing the number means increasing the probability of two different [input value] with the same output.

    I think that the much better way would be the use of "ID-Crypting" with a Bijectiv function. So no collisions could happen! For the simplest kind just use an Affine_cipher

    Example with max input value range from 0 to 25:

    function numcrypt($a)
    {
       return ($a * 15) % 26;
    }
    
    function unnumcrypt($a)
    {
       return ($a * 7) % 26;
    }
    

    Output:

    numcrypt(1) : 15
    numcrypt(2) : 4
    numcrypt(3) : 19
    
    unnumcrypt(15) : 1
    unnumcrypt(4)  : 2
    unnumcrypt(19) : 3
    

    e.g.

    $id = unnumcrypt($_GET('userid'));
    
    ... do something with the ID ...
    
    echo '<a href="do.php?userid='. numcrypt($id) . '"> go </a>';
    

    of course this is not secure, but if no one knows the method used for your encryption then there are no security reasons then this way is faster and collision safe.

    0 讨论(0)
提交回复
热议问题