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

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

http://bit.ly/aUekJP 

或cloudapp:

 http://cl.ly/1hVU 

哪个甚至更小

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

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

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

任何帮助将非常感谢:)

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

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

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

编辑

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

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

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

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

回去

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

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

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

我发现这很简短可靠:

 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 

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