php: number only hash?

后端 未结 7 2003
眼角桃花
眼角桃花 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 ' go ';
    

    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.

提交回复
热议问题