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
等。