Youtube网址式哈希

时间:2010-02-10 13:45:01

标签: php hash

我正在尝试找出如何构建漂亮且简短的字母数字哈希,就像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有大写和小写的整个英文字母。知道他们是怎么做到的吗?

5 个答案:

答案 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可以将多个数字加密/解密成一个哈希值。)

修改

  1. 更改了网址以包含文档网站和代码来源
  2. 更改了示例代码以适应主要的lib更新(当前的PHP lib版本为0.3.0 - 感谢所有开源社区改进了lib)

答案 3 :(得分:-1)

可以使用base64_encode()完成类似的事情。

答案 4 :(得分:-1)

可能是md5(的一部分)的base64编码?虽然我似乎记得有短的和长的,所以它可能是md5或sha1。 如果你对你给出的令牌进行base64解码,并使用适当的填充,结果是一个8位实体,所以它不是一个完整的md5。它可能只是它的前半部分。