使用哈希减少PHP中的时间戳长度

时间:2017-04-17 22:30:42

标签: php algorithm hash

我编写了自己的实现,生成了36个字符的长度标识符,你可以说我自己的UUID,它应该类似于以下内容:

  1. 当前时间戳值填充 - 直到长度为11
  2. 随机4个字符大写,小写和数字字符后跟 -
  3. 随机20个字符大写,小写和数字字符
  4. 处理该ID的数据库表的字段也将在bin整理中使其值区分大小写。

    结果ID可能类似于以下示例:

    1491681481-TI5b-7aCPMLK9a7MMLoSdhr5d
    

    此处,时间戳长度为10,我希望减少该长度,并将差异替换为-。我试图在PHP中搜索可用的哈希算法:

    foreach(hash_algos() as $alg){
            $h = hash($alg,1491681054);
            echo $alg."==>".$h."== Length ". strlen($h)."\n<br>";
        }
    

    我发现有些算法会返回8个字符长度,例如

    1. 的Adler32
    2. CRC32
    3. crc32b
    4. fnv132
    5. fnv1a32
    6. 那些散列算法对我来说很好。但是,我害怕碰撞。

      我需要知道那些算法的碰撞概率其中源字符串只是十进制数?换句话说,输入类型或格式化是否应该降低任何一种算法的冲突概率?

1 个答案:

答案 0 :(得分:1)

根据maraca评论,我做了一个简单的实现,将时间戳的十进制值转换为基于62的数字,即英文字母的数字,大写和小写的总和,如下所示:

<?php

$stem = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$old = 10; //original base -decimal-
$new = strlen($stem); //new base
$num = 1491681054; // decimal input
$out = '';
while($num > 0){
   $devide =  $num/$new ;    
   $result =  explode('.',$devide)[0]// could use floor();    
   $remind = $devide - $result;    
   $num = $result;
   $out = substr($stem,round($remind * $new),1).$out;
}

echo "<hr>";
echo $out;
// returns 1CWWnQ

通过这种方式,长度为10的十进制数被转换为仅具有长度为6个字符的基数62。 更改为字母字符顺序,可能会导致更改输出结果,我们也可以通过添加更多符号来增加基数。 (但如果id将在URL中使用,则为ware)

Reference

相关问题