5

我正在尝试生成与 bit.ly url 样式相同的 UUID,例如:

http://bit [dot] ly/aUekJP

或 cloudapp 的:

http://cl [dot] ly/1hVU

甚至更小

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

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

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

任何帮助将不胜感激:)


编辑说明:将点字母替换[dot]禁用短链接的解决方法

4

4 回答 4

15

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

有点,tinyurl 等人存储链接并生成一个短代码来表示该链接。他们不会从他们在数据存储中查找的代码重构 URL 并返回相应的 URL。这些不是 UUIDS。

在不了解您的应用程序的情况下,很难建议您应该使用哪种方法,但是您可以使用数字键将您指向的任何内容存储在数据存储中,然后使用 10 位数字和 22 个小写字母将键重新设置为 base32,或许可以避免明显的错字问题,例如 'o' 'i' 'l' 等

编辑

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

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

于 2010-07-19T15:05:28.670 回答
10

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

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

回去

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

所以你不必存储任何东西,你总是可以解码传入的 short_code。

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

于 2012-09-18T15:16:11.993 回答
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
于 2013-12-23T17:13:36.173 回答
-12

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

于 2010-07-19T14:48:04.547 回答