我编写了自己的实现,生成了36个字符的长度标识符,你可以说我自己的UUID,它应该类似于以下内容:
处理该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
个字符长度,例如
那些散列算法对我来说很好。但是,我害怕碰撞。
我需要知道那些算法的碰撞概率其中源字符串只是十进制数?换句话说,输入类型或格式化是否应该降低任何一种算法的冲突概率?
答案 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)