【发布时间】:2013-12-27 12:48:59
【问题描述】:
我正在寻找可用作用户 ID 生成器的最佳字符串序列生成器。据我所知,它应该实现以下功能:
- 长度限制为 8 个字符。
- 由拉丁符号和数字组成
- 公开,因此应该被混淆
现在我想出了以下算法:
def idgen(begin, end):
assert type(begin) is int
assert type(end) is int
allowed = reduce(
lambda L, ri: L + map(chr, range(ord(ri[0]), ord(ri[1]) + 1)),
(('a', 'z'), ('0', '9')), list()
)
shift = lambda c, i: allowed[(allowed.index(c) + i) % len(allowed)]
for cur in xrange(begin, end):
cur = str(cur).zfill(8)
cur = izip(xrange(0, len(cur)), iter(cur))
cur = ''.join([shift(c, i) for i, c in cur])
yield cur
但它会给出非常相似的 id,例如 0-100: '01234567'、'01234568'、'01234569'、'0123456a'等
那么最佳实践是什么?怎么样,我想 url 缩短器应该使用某种类似的算法?
【问题讨论】:
-
@goncalopp 它不应该是随机的,随机意味着碰撞机会,我想避免它。
标签: python string algorithm sequences