我正在尝试找出如何构建漂亮且简短的字母数字哈希,就像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";
}
?>
但他们中没有一个回来的人物超出你期望的a-f。 Youtube有大写和小写的整个英文字母。知道他们是怎么做到的吗?
答案 0 :(得分:6)
您希望将整数转换为使用完整字母表的不同基数。 Base64可以工作,但你会得到比原始整数更长的字符串,因为base64_encode()函数接受一个字符串,而不是一个整数。
我的建议是使用base_convert()函数,如下所示:
$id = 12834233;
$hash = base_convert($id, 10, 36);
和反向
$hash = '7n2yh'
$id = base_convert($hash, 36, 10);
然而,这只会使用小写字母a-z和0-9。如果您希望使用所有大写和小写字母,则需要转换为base 62(如果使用符号,则需要更高)。但要做到这一点,你必须编写自己的代码。
编辑:Gordon在php中指出了这个great link到base62编码。
答案 1 :(得分:5)
您可以使用base_convert()将您的号码转换为基数36,它使用0-9加a-z,其优点是您的网址参数不区分大小写。
答案 2 :(得分:5)
我遇到了类似的问题,并为此为自己写了一个课程。
文档: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);
您将获得以下$hash
: Rz0zlKZGg6g
为salt值提供您自己的唯一字符串。代码中的11是可选的,代表最小散列长度。 (您还可以将自己的字母字符串定义为构造函数的第3个参数。)
要解密哈希,你可以这样做:
$numbers = $hashids->decrypt($hash);
所以$numbers
将是:[12834233]
(这是一个数组,因为hashids可以将多个数字加密/解密成一个哈希值。)
修改强>:
答案 3 :(得分:-1)
可以使用base64_encode()
完成类似的事情。
答案 4 :(得分:-1)
可能是md5(的一部分)的base64编码?虽然我似乎记得有短的和长的,所以它可能是md5或sha1。 如果你对你给出的令牌进行base64解码,并使用适当的填充,结果是一个8位实体,所以它不是一个完整的md5。它可能只是它的前半部分。