如何将用户创建的内容保存为URL(哈希)参数?

时间:2014-02-15 18:39:52

标签: php mysql ajax post hash

我想启用"保存"我的网络应用中的功能。我将数据发送到PHP post接收器,并将数据保存在MySQL行中,所以通常我可以用它的id加载它:

site.com/content/123

但是我想(只是为了看上去好看的)使用" hash" (不确定它是否是正确的术语),例如:

site.com/content/A2w7SqZ

就像jsFiddle一样。如何将id(整数)转换为哈希?

示例: http://jsfiddle.net/sfu24/

我能想到的唯一方法是MD5。但它会生成一个很长的字符串。我认为6个字符绰绰有余。

那么如何制作像jsfiddle这样的哈希系统?

感谢您的帮助!

P.S。我确定这个问题已被问过百万次。但是我无法找到它。如果您知道已经存在的答案,请发布链接,我将删除该问题。

3 个答案:

答案 0 :(得分:2)

生成随机字符

function generate_random($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for($i = 0; $i < $length; $i ++) {
        $randomString .= $characters [rand ( 0, strlen ( $characters ) - 1 )];
    }
    return $randomString;
}

答案 1 :(得分:1)

base_convert()

为目标

hashids

这将帮助您从数字中生成短哈希值(如YouTube和Bitly)。

答案 2 :(得分:1)

function generateHash($int) {
    $rand_letters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $newstr = '';
    for ($i = 0; $i < strlen($int); $i++) {
        $newstr .= $rand_letters[rand(0, strlen($rand_letters)-1)];
    }
    return $newstr;
}

function myHash($int) {
    $newstr = generateHash($int);
    $result = $db->query("SELECT COUNT(*) FROM hashes WHERE hash = '$newstr';");
    if ($result->num_rows > 0) {
        myHash($int);
    }
    return $newstr;
}

echo myHash(973451);

您在传递的整数的长度的基础上生成字符串。这就是generateHash()的作用。 myHash()使用这个字符串,如果它已经存在,再次运行,直到生成not-present字符串,所以返回它。

哈希是随机的,所以它们不是直接可逆的(它们仍然可以),但是“12345”不会每次都产生一个相同的字符串。