【问题标题】:How to save user-created content as a URL (hash) parameter?如何将用户创建的内容保存为 URL(哈希)参数?
【发布时间】:2014-02-15 18:39:52
【问题描述】:

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

site.com/content/123

但我想(只是为了花哨的外观)为此使用“哈希”(不确定它是否正确),例如:

site.com/content/A2w7SqZ

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

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

我能想到的唯一方法是 MD5。但它会生成一个很长的字符串。我觉得6个字就够了。

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

感谢您的帮助!

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

【问题讨论】:

  • 您可以构建自己的哈希系统。循环遍历字母和数字并随机附加它们
  • 但我只有一个整数作为种子。现在我找到了一个方法here 它建议取一个MD5哈希的子串。它会起作用吗?不危险吗? (冲突的危险)?
  • 首先你想做什么?花哨的外观还是md5? md5 不会像您的示例中那样生成花哨的字符串。如果你想生成随机字符,这里那里有很多函数。选择其中一个,生成随机字符,将其与相关 id 一起保存到数据库,如果需要,读取并重定向到相关 id...
  • @optional 不,我想要随机字符(字母数字,大写和小写),它们不必有意义。让我改变我的例子:)
  • @CengizFrostclaw 他们必须是可逆的吗?我的意思是您是否希望“12345”每次都响应“g4L3w9”,或者如果您对字符串“12345”进行 5 次哈希处理,您将收到 5 个不同的哈希值?

标签: php mysql ajax post hash


【解决方案1】:

生成随机字符

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

【讨论】:

  • 谢谢,但这有可能生成两个相等的字符串。可能性很小,但确实存在。
  • @CengizFrostclaw 那么您的自定义函数可以在数据库中循环,如果找到字符串 - 再次运行?
  • @CengizFrostclaw 此函数生成随机字符串,其中包含 $characters 变量中的字符。 $length 是生成字符串的长度......例如 generate_random(8);会为你生成这样的东西:De1aSf3h
  • 好的,Royal Bg 是对的。我只是在寻找一种单发方式。但是,即使是 MD5 也能消除这种危险,对吧?
  • MD5更有这个危险。因为“12345”每次都会产生一个相同的哈希值。
【解决方案2】:

看看base_convert()

hashids

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

【讨论】:

  • 谢谢!我现在就试试 hashids。
  • 哇,hashids 非常适合我的示例,因为我要保存的数据实际上是一个数字数组。所以你的回答绝对拯救了我的一天!谢谢:)
  • 几个月前我实际上也在看这个(网址缩短技术),我找到了一个很好的算法站点,然后我尝试再次找到但仍然没有成功。我一找到网址就会在这里发送。很高兴 hashids 可以帮助您解决问题。 :)
  • 会的,但是有个小问题。如何将字符串 "1,2,42,55" 转换为 encrypt() 的输入?我可以炸掉它们,但那又怎样?
【解决方案3】:
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() 使用这个字符串,如果它已经存在,则再次运行自己,直到生成不存在的字符串,所以返回它。

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

【讨论】:

  • 谢谢!对所有答案 +1。
猜你喜欢
  • 2014-08-17
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多