代码之家  ›  专栏  ›  技术社区  ›  Mark L

Youtube URL样式哈希

  •  4
  • Mark L  · 技术社区  · 14 年前

    我正试图找出如何构建像youtube URL中使用的那种漂亮而简短的字母数字散列。

    例子: http://www.youtube.com/watch?v=rw71YOSXhpE

    其中rw71YOSXhpE将转换为视频号码12834233(例如)。

    这些整数可以在PHP中反转为整数,然后在数据库中查找。

    <?
    $algoList = hash_algos( );
    
    foreach( $algoList as $algoName )
    {
        echo $algoName . ": " . hash( $algoName, 357892345234 ) . "\n";
    }
    ?>
    

    但是他们没有一个会带着超出你预期的a-f的角色回来。Youtube上有全英文字母大写和小写。知道他们是怎么做到的吗?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Heinzi    14 年前

    你可以用 base_convert()

        2
  •  6
  •   bramp Madhur Ahuja    14 年前

    您希望将整数转换为另一个使用完整字母表的基数。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。如果希望使用所有大写和小写字母,则需要转换为基数62(如果使用符号,则转换为更高)。然而,要做到这一点,您必须编写自己的代码。

    编辑 :戈登指出了这一点 great link 在php中使用base62编码。

        3
  •  5
  •   ivanakimov    11 年前

    我也有类似的问题,为此我自己写了一个课程。

    文档: http://www.hashids.org/php/

    来源: https://github.com/ivanakimov/hashids.php

    您可以这样使用它:

    require('lib/Hashids/Hashids.php');
    
    $hashids = new Hashids\Hashids('salt value', 11);
    $hash = $hashids->encrypt(12834233);
    

    你会得到以下结果 $hash : Rz0zlKZGg6g

    要解密哈希,请执行以下操作:

    $numbers = $hashids->decrypt($hash);
    

    $numbers 将: [12834233]

    编辑 :

    1. 更改URL以同时包含文档网站和代码源
        4
  •  -1
  •   Ignacio Vazquez-Abrams    14 年前

    类似的事情也可以用它来做 base64_encode()

        5
  •  -1
  •   Stefano Borini    14 年前