返回短哈希的双向编码函数

时间:2013-01-31 15:58:28

标签: java php math encoding character-encoding

我们正在为我们的网站构建网址缩短功能。

我们现在的目标是什么:

  • 我们采用一个URL(http://www.google.com)并对其进行sha1,最后得到一个40个字符的哈希值(738ddf35b3a85a7a6ba7b232bd3d5f1e4d284ad1)。
  • 我们采用sha1哈希并将其编码为base62(基本上是A-Z,a-z,0-9)并最终得到28个字符的哈希值(jNMYchEoche67ro1k5gsCcHfDzmR),我们可以将其解码回原始的sha1。

我们使用sha1的原因是为了确保用户无法猜出当前/过去网址中的下一个网址。

我们使用base62的原因是为了使URL有效并且对用户可读。

现在,将附加到我们的域(http://www.google.com/r/jNMYchEoche67ro1k5gsCcHfDzmRis)的28个字符“short-url”有点太长,尤其是当您考虑Twitters字符限制时。

我们目前正在考虑的是将sha1减少大约20个字符,这将产生一个14个字符的短网址,但是进一步下降,我们担心我们会碰到碰撞太快。

我们还考虑过Compressing big number (or string) to small value但是这需要我们将28或14个字符的哈希分成2个部分并对这些部分进行排序,我们不知道如何从那里返回原始哈希。

有没有人知道我们能做什么?我们更喜欢一种解决方案,我们不依赖于数据库来构建URL,但如果需要DB,请记住我们仅限于Redis / MongoDB(这意味着没有自动增量整数字段)。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的所有要求,但这就是我的想法......

减少sha1似乎是正确的方法。

如果您“注册”数据库中的每个短网址,您可以通过尝试在冲突中分配备用短网址来避免冲突(如果已在您的数据库中找到哈希值,则会发生冲突)。

它会像这样工作:

  1. 尝试分配一个新哈希,尽可能多地剪切sha1,结果我们有HASH1
  2. 检查DB中的冲突,无冲突,在DB中注册HASH1并完成
  3. 如果是碰撞,请尝试分配一个新的哈希,例如通过将sha1减少一个字符(导致更长的哈希值),结果我们有HASH2
  4. 检查碰撞..(步骤2)等等
  5. 每次要查找散列的正确长URL时,您都必须咨询您的数据库。我想这就是你现在已经在做的事情,因为sha1是不可逆转的。

    你最初应该在多大程度上削减sha1?我会尽可能地说,只要你满足你的要求,就会很难猜到下一个网址。我会说只留下5个字节的sha1(那是40位)会很难猜测..(如果你的数据库中有100万个短网址,那么它仍将是百万分之一的猜测)