擅长:python、mysql、java
<p>你的算法是好的(线程安全,只要你的dbapi模块是安全的),可能是最好的方法。它不会给您重复的(假设您在sid上有主键或唯一键),但是您在插入时获得<code>IntegrityError</code>异常的机会非常小。但是你的代码看起来不太好。最好使用尝试次数有限的循环,而不是递归(如果代码中出现某些错误,递归可能会变得无限):</p>
<pre><code>for i in range(MAX_ATTEMPTS):
sid = os.urandom(8).decode('hex')
db.execute('SELECT COUNT(*) FROM sessions WHERE sid=?', (sid,))
if not db.fetchone()[0]:
# You can catch IntegrityError here and continue, but there are reasons
# to avoid this.
db.execute('INSERT INTO sessions (sid) VALUES (?)', (sid,))
break
else:
raise RuntimeError('Failed to generate unique session ID')
</code></pre>
<p>你可以增加随机字符的数目,用来使失败的机会更小。<code>base64.urlsafe_b64encode()</code>是您的朋友,如果您想缩短SID,但是您必须确保您的数据库对此列使用区分大小写的比较(MySQL的VARCHAR不适合,除非您为其设置二进制排序规则,但是VARBINARY是可以的)。在</p>