Ruby on Rails - 生成bit.ly样式的uuids

时间:2010-07-19 14:42:54

标签: ruby-on-rails url uuid short

我正在尝试使用与bit.ly网址相同的样式生成UUID:

http://bit.ly/aUekJP

或cloudapp:

http://cl.ly/1hVU

甚至更小

我该怎么办? 我现在正在使用UUID gem作为ruby,但我不确定是否可以限制长度并得到类似的东西。 我目前正在使用这个:

UUID.generate.split("-")[0] => b9386070

但是我想要更小,并且知道它将是独一无二的。

非常感谢任何帮助:)

4 个答案:

答案 0 :(得分:14)

你在这里混淆了两件不同的事情。 UUID是一种通用唯一标识符。即使在世界各地同时创建了数百万个,它也很有可能是独一无二的。它通常显示为36位数字符串。你不能砍掉前8个字符并期望它是唯一的。

Bitly,tinyurl et-al存储链接并生成表示该链接的短代码。他们不会从他们在数据存储中查找的代码重建URL并返回相应的URL。这些不是UUIDS。

在不知道您的应用程序的情况下,很难建议您应该使用什么方法,但是您可以使用数字键将您指向的任何内容存储在数据存储中,然后使用10位和22将键重新键入base32小写字母,也许可以避免明显的拼写错误问题,如'o''我'等'

修改

在进一步调查中,有一个Ruby base32 gem可用于实现Douglas Crockford的Base 32 implementation

一个5个字符的Base32字符串可以代表超过3300万个整数和一个超过10亿的6位字符串。

答案 1 :(得分:10)

如果您正在使用数字,则可以使用内置的ruby方法

6175601989.to_s(30)
 => "8e45ttj" 

回去

"8e45ttj".to_i(30)
=>6175601989

因此您无需存储任何内容,您始终可以解码传入的short_code。

这适用于概念验证,但您无法避免模糊的字符,如:1lji0o。如果您只是想使用代码来混淆数据库记录ID,这将正常工作。通常,短代码应该易于记忆并从一种介质转移到另一种介质,例如在某人的演示幻灯片上阅读,或通过电话听到它。如果您需要避免难以阅读或难以“听到”的字符,您可能需要切换到生成可接受代码的过程并存储它。

答案 2 :(得分:0)

我发现这很简短可靠:

def create_uuid(prefix=nil)
  time   = (Time.now.to_f * 10_000_000).to_i
  jitter = rand(10_000_000) 
  key    = "#{jitter}#{time}".to_i.to_s(36)
  [prefix, key].compact.join('_')
end

这会显示如下所示的唯一键:' 3qaishe3gpp07w2m '
减少“抖动”大小以减小密钥大小。

<强>警告: 这不保证是唯一的(使用SecureRandom.uuid),但它非常可靠:

10_000_000.times.map {create_uuid}.uniq.length == 10_000_000

答案 3 :(得分:-10)

保证唯一性的唯一方法是保持全局计数并为每次使用增加它:00000001等。