如何按一定规则生成一个编号

2011-03-25 21:32:42 +08:00
 oldgun
问题是这样的:
需要生成一个编号,分类+日期+随机编号(自增);
例如分类01,日期2011年03月25日,随机编号001,那生成编号0120110325001。
这个该如何处理?
6011 次点击
所在节点    Python
14 条回复
oldgun
2011-03-25 22:34:18 +08:00
有人愿意看一下吗?
keakon
2011-03-25 22:56:24 +08:00
可以试试generator
http://www.python.org/dev/peps/pep-0289/

from datetime import date

def number_generator(type_number):
last_day = date.today()
number = 0
while True:
today = date.today()
if last_day == today:
number += 1
else:
last_day = today
number = 1
yield '%s%s%03d' % (type_number, today.strftime('%Y%m%d'), number)

generator = number_generator('01')
print generator.next()
print generator.next()
print generator.next()
print generator.next()

结果:
0120110325001
0120110325002
0120110325003
0120110325004
oldgun
2011-03-25 23:11:52 +08:00
@keakon 谢谢!
不过忘了关键点了,补充一下,在分布式和并发环境下如何保证编号的连续及唯一呢?想过利用数据库的sequence 但最好不要。用锁吗?
keakon
2011-03-25 23:26:29 +08:00
@oldgun 这和语言无关了,可以用数据库或memcached之类服务的来实现
oldgun
2011-03-25 23:31:02 +08:00
@keakon 因为想用sqlite或Berkeleydb,数据库层面实现很基本无望。oracle的sequence应该可以,不过高并发下恐怕效率会很低。初步想建一个带锁机制的服务来解决了。
summic
2011-03-25 23:33:11 +08:00
唯一性的问题,存数据库,然后实现一个乐观锁就行了
oldgun
2011-03-25 23:33:42 +08:00
@keakon 关键解决分布式,高并发的话应该不会达到,不然就要换数据库了。
oldgun
2011-03-25 23:37:21 +08:00
@summic 不用数据库
napoleonu
2011-03-25 23:53:29 +08:00
编号为什么一定要连续呢?
oldgun
2011-03-26 00:05:01 +08:00
@napoleonu 因为这是要求,总有一些要求的,这是其中一个。
napoleonu
2011-03-26 00:22:03 +08:00
@oldgun 是要最终连续还是要按照写数据的时间循序连续?我觉的问题描述不清楚,分布式的单点会不会一直增加?要不要考虑单点故障?
summic
2011-03-26 12:40:00 +08:00
@oldgun 总之要有一个单点来存储吧?不然怎么知道上一个自增的编号到几了
Kymair
2011-03-26 12:53:03 +08:00
可以考虑下Redis
自增和自减是原子的
经常被拿来做id generator
oldgun
2011-03-26 14:44:54 +08:00
@oldgun 不能用编好号来取用的方式。
对不起有个要求没说清楚,编号是按时间连续的与分类无关,分类是个标识。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/10398

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX