我正在尝试使用与bit.ly网址相同的样式生成UUID:
http://bit.ly/aUekJP
或cloudapp:
http://cl.ly/1hVU
甚至更小
我该怎么办? 我现在正在使用UUID gem作为ruby,但我不确定是否可以限制长度并得到类似的东西。 我目前正在使用这个:
UUID.generate.split("-")[0] => b9386070
但是我想要更小,并且知道它将是独一无二的。
非常感谢任何帮助:)
答案 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)
保证唯一性的唯一方法是保持全局计数并为每次使用增加它:0000
,0001
等。