创建“看起来很漂亮”的简短唯一ID(字符和数字)...就像YouTube ID(PHP)

时间:2012-01-03 22:52:47

标签: php encryption hash url-shortener

我希望能够从整数生成唯一的字符串id。

所以例如'1'被转换为'o7wu',反之亦然。 (使用数字搜索数据库和字符串进行显示)

我发现了这个很棒的功能:http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/,但是对于小数字,生成的ID实际上是丑陋,例如 '1'是'aacd','2'是'aadd'。我还发现http://blog.kevburnsjr.com/php-unique-hash,生成的ID看起来很棒,但我认为它们只是“单向”。

我真的不需要任何加密,我只需要简短,漂亮。

对于那些因为我对一个漂亮的ID的定义而变得虚弱的人:我将chars和ints作为真正的随机混合定义。 NOT:aabb33,abc123,aa22cc。是的:dfh7,ao8f,z6t4 ..等等......

2 个答案:

答案 0 :(得分:1)

随机数生成器可以被黑客攻击以减少随机数。实际上,你可以让它们每次使用相同的数字。如果将种子设置为相同的数字,您将获得相同的序列。这是一个通过传递单个数字来创建“随机”字符串的示例。

<?php
$n = 1;

// Any number to be added to the random seed
// Different numbers give different sequences
$offset = 45;

srand($n + $offset);
$code = '';

for($i=0; $i<4; $i++) {
    // Numbers and letters
    $char = rand(48, 57+26);

    // Lower case letters
    if ($char > 57) $char += 39;
    $code .= chr($char);
}

echo "The code is $code\n";

使用此偏移量,1表示'ghep',2表示'tw70',3表示'ob0c'。要增加字符数,请将$i<4更改为5或13.要更改包含的字符,请使用不同的ASCII codes范围。

答案 1 :(得分:0)

我也尝试了第一个链接,并且提供的代码收效甚微。我做了一些研究,我认为YouTube ID基本上只是随机生成的字符串(假设有近74种可能的组合,两个ID相似的机会非常渺茫)。下面是一个小小的PHP脚本,我用它来创建11个字符的YouTube风格的随机ID。

$length = 11;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';

$random_id = "";

for ($i = 0; $length > $i; $i++) {
    $random_id .= $characters[mt_rand(0, strlen($characters) -1)];
}

上面的脚本基本上创建了一个64个字符的列表,与YouTube使用的字符相同,随机选择其中的11个字符,然后在for循环中将它们连接起来。然后,我将在列中生成的随机ID存储为通过URL搜索的随机ID。它不包括加密,但它是我能想到的最接近的东西。您可以通过更改$ length变量和更改组成$ characters变量的字符所使用的字符来更改字符串的长度。

很少提示,如果您使用的是MySQL数据库,请将随机ID列的排序规则更改为latin1_bin,这样就可以包含区分大小写。