我试图找出如何构建漂亮和短的字母数字哈希,如在youtube网址中使用的类型.
示例:http://www.youtube.com/watch?v = rw71YOSXhpE
其中rw71YOSXhpE将转换为视频号码12834233(例如).
这些整数可以在PHP中反转为整数,然后在数据库中查找.
我在PHP中运行以下代码:
<?
$algoList = hash_algos( );
foreach( $algoList as $algoName )
{
echo $algoName . ": " . hash( $algoName, 357892345234 ) . "\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
但是他们中没有一个回来的人物超出了你的期望.Youtube有大写和小写的整个英文字母.知道他们是怎么做到的吗?
您希望将整数转换为使用完整字母表的不同基数.Base64可以工作,但你会得到比原始整数更长的字符串,因为base64_encode()函数接受一个字符串,而不是一个整数.
我的建议是使用base_convert()函数,如下所示:
$id = 12834233;
$hash = base_convert($id, 10, 36);
Run Code Online (Sandbox Code Playgroud)
反之亦然
$hash = '7n2yh'
$id = base_convert($hash, 36, 10);
Run Code Online (Sandbox Code Playgroud)
但是,这只会使用小写字母az和0-9.如果您希望使用所有大写和小写字母,则需要转换为base 62(如果使用符号,则需要更高).但要执行此操作,您必须编写自己的代码.
编辑:戈登指出这个伟大的链接到PHP中的base62编码.
我遇到了类似的问题,并为此为自己写了一堂课.
文档:http://www.hashids.org/php/
Souce:https://github.com/ivanakimov/hashids.php
你会像这样使用它:
require('lib/Hashids/Hashids.php');
$hashids = new Hashids\Hashids('salt value', 11);
$hash = $hashids->encrypt(12834233);
Run Code Online (Sandbox Code Playgroud)
你会得到以下$hash:Rz0zlKZGg6g
为salt值提供您自己的唯一字符串.代码中的11是可选的,代表最小散列长度.(您还可以将自己的字母字符串定义为构造函数的第3个参数).
要解密散列,您可以这样做:
$numbers = $hashids->decrypt($hash);
Run Code Online (Sandbox Code Playgroud)
所以$numbers将是:[12834233]
(这是一个数组,因为hashids可以将多个数字加密/解密为一个哈希值.)
编辑:
| 归档时间: |
|
| 查看次数: |
3633 次 |
| 最近记录: |