一种标识号生成方法、生成装置、电子设备及存储介质转让专利
申请号 : CN201910779147.8
文献号 : CN110554732B
文献日 : 2021-07-02
发明人 : 张骏杰 , 宋忠良 , 李阳幸子
申请人 : 北京奇艺世纪科技有限公司
摘要 :
权利要求 :
1.一种标识号生成方法,其特征在于,所述方法包括:获取第一初始时间戳,并确定所述第一初始时间戳对应的初始时刻,所述第一初始时间戳为预设的初始标识号中的时间戳;
基于所述第一初始时间戳,以及当前时刻与所述初始时刻之间的差值,确定待生成标识号的时间戳;所述当前时刻为接收针对所述标识号的生成指令的时刻;
在所述待生成标识号的时间戳小于历史时间戳的情况下,基于所述待生成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定所述待生成标识号的时钟回拨次数;所述历史生成标识号为所述待生成标识号的前一已生成标识号;所述历史时间戳为所述待生成标识号的历史生成标识号对应的时间戳;
基于所确定的所述待生成标识号的时间戳,所述待生成标识号的时钟回拨次数,所述待生成标识号的预设机器身份标识号ID,以及所述待生成标识号预先生成的序列号,生成所述待生成标识号;已生成的标识号中,用于表示所述时钟回拨次数的第一号段位于用于表示所述时间戳的第二号段之前。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:在所述待生成标识号的时间戳大于或等于所述历史时间戳的情况下,将所述历史生成标识号的时钟回拨次数确定为所述待生成标识号的时钟回拨次数。
3.根据权利要求1或2所述的方法,其特征在于,所述在所述待生成标识号的时间戳小于历史时间戳的情况下,基于所述待生成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定所述待生成标识号的时钟回拨次数之前,所述方法还包括:判断所述待生成标识号的时间戳与所述历史时间戳之间的大小。
4.根据权利要求1所述的方法,其特征在于,所述基于所述待生成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定所述待生成标识号的时钟回拨次数的步骤,包括:
将所述历史生成标识号的时钟回拨次数加一,得到所述待生成标识号的时钟回拨次数;
所述方法还包括:
将所述待生成标识号的时间戳更新为预设的第二初始时间戳;
将所述待生成标识号的序列号设置为预设的第二初始序列号。
5.根据权利要求2所述的方法,其特征在于,所述在所述待生成标识号的时间戳大于或等于所述历史时间戳的情况下,将所述历史生成标识号的时钟回拨次数确定为所述待生成标识号的时钟回拨次数的步骤之后,所述方法还包括:在所述待生成标识号的时间戳大于所述历史时间戳的情况下,将所述待生成标识号的序列号设置为预设的第三初始序列号;
在所述待生成标识号的时间戳等于所述历史时间戳的情况下,将所述历史生成标识号的序列号与第二预设数值之和,确定为所述待生成标识号的序列号。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:在所述待生成标识号的时间戳对应的时刻达到预设时刻时,将所述待生成标识号的时钟回拨次数与第三预设数值之和,确定为所述待生成标识号的新的时钟回拨次数;
将所述待生成标识号的时间戳更新为预设的第三初始时间戳。
7.根据权利要求1所述的方法,其特征在于,所述获取第一初始时间戳之前,所述方法还包括:
根据预设的符号位,预设的初始时钟回拨次数,预设的第一初始时间戳,预设的机器ID,以及预设的第一初始序列号,组成初始标识号;所述初始时钟回拨次数为所述初始时刻对应的时钟回拨次数,所述第一初始序列号为所述初始时刻对应的序列号。
8.根据权利要求1所述的方法,其特征在于,已生成的标识号中,用于表示所述时间戳的第二号段位于用于表示所述序列号的第三号段之前。
9.一种标识号生成装置,其特征在于,所述装置包括:处理模块,用于获取第一初始时间戳,并确定所述第一初始时间戳对应的初始时刻,所述第一初始时间戳为预设的初始标识号中的时间戳;
第一确定模块,用于基于所述第一初始时间戳,以及当前时刻与所述初始时刻之间的差值,确定待生成标识号的时间戳;所述当前时刻为接收针对所述标识号的生成指令的时刻;
第二确定模块,用于在所述待生成标识号的时间戳小于历史时间戳的情况下,基于所述待生成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定所述待生成标识号的时钟回拨次数;所述历史生成标识号为所述待生成标识号的前一已生成标识号;
所述历史时间戳为所述待生成标识号的历史生成标识号对应的时间戳;
生成模块,用于基于所确定的所述待生成标识号的时间戳,所述待生成标识号的时钟回拨次数,所述待生成标识号的预设机器ID,以及所述待生成标识号预先生成的序列号,生成所述待生成标识号;已生成的标识号中,用于表示所述时钟回拨次数的第一号段位于用于表示所述时间戳的第二号段之前。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:第三确定模块,用于在所述待生成标识号的时间戳大于或等于所述历史时间戳的情况下,将所述历史生成标识号的时钟回拨次数确定为所述待生成标识号的时钟回拨次数。
11.根据权利要求9或10所述的装置,其特征在于,所述装置还包括:判断模块,用于判断所述待生成标识号的时间戳与所述历史时间戳之间的大小。
12.根据权利要求9所述的装置,其特征在于,所述第二确定模块具体用于:将所述历史生成标识号的时钟回拨次数加一,得到所述待生成标识号的时钟回拨次数;
所述装置还包括:
第一更新模块,用于将所述待生成标识号的时间戳更新为预设的第二初始时间戳;
第一设置模块,用于将所述待生成标识号的序列号设置为预设的第二初始序列号。
13.根据权利要求10所述的装置,其特征在于,所述装置还包括:第二设置模块,用于在所述待生成标识号的时间戳大于所述历史时间戳的情况下,将所述待生成标识号的序列号设置为预设的第三初始序列号;
第四确定模块,用于在所述待生成标识号的时间戳等于所述历史时间戳的情况下,将所述历史生成标识号的序列号与第二预设数值之和,确定为所述待生成标识号的序列号。
14.根据权利要求9所述的装置,其特征在于,所述装置还包括:第五确定模块,用于在所述待生成标识号的时间戳对应的时刻达到预设时刻时,将所述待生成标识号的时钟回拨次数与第三预设数值之和,确定为所述待生成标识号的新的时钟回拨次数;
第二更新模块,用于将所述待生成标识号的时间戳更新为预设的第三初始时间戳。
15.根据权利要求9所述的装置,其特征在于,所述装置还包括:组成模块,用于根据预设的符号位,预设的初始时钟回拨次数,预设的第一初始时间戳,预设的机器ID,以及预设的第一初始序列号,组成初始标识号;所述初始时钟回拨次数为所述初始时刻对应的时钟回拨次数,所述第一初始序列号为所述初始时刻对应的序列号。
16.根据权利要求9所述的装置,其特征在于,已生成的标识号中,用于表示所述时间戳的第二号段位于用于表示所述序列号的第三号段之前。
17.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器、通信接口和存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现权利要求1‑8任一所述的方法步骤。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1‑8任一所述的方法步骤。
说明书 :
一种标识号生成方法、生成装置、电子设备及存储介质
技术领域
背景技术
求在同一业务场景下全局唯一。在生成标识号的诸多算法中,由Twitter公司提出的
snowflake算法生成的标识号的位数较少,能够有效节省存储空间和减少资源占用;同时生
成的标识号呈递增趋势,而且可以通过标识号追溯来源机器。此外,snowflake算法不需要
借助第三方,其自身便可生成标识号,因此不存在因第三方组件发生故障而导致生成标识
号的过程中出现故障的情况,也不存在因与第三方组件交互的过程中产生额外的网络消耗
的情况,因此,snowflake算法在生成标识号中使用最为广泛。
作机器ID,12位二进制数表示序列号。时间戳基于工作机器的本机时钟生成,在同一时间戳
对应的时刻下会生成多个标识号,因此这些标识号需由不同的序列号区分,且不同的序列
号随时间增加呈递增趋势。
从当前时刻回退到之前的某一个时刻,例如,回退到当前时刻一小时之前的时刻等,在这种
情况下,生成的标识号的时间戳也会随之回退,如果仍按照回退后的时间戳生成的标识号,
则可能出现所生成的标识号与时钟回退之前在该时刻生成的标识号相同的情况,造成出现
标识号重复的问题。
发明内容
技术方案如下:
拨次数;所述历史生成标识号为所述待生成标识号的前一已生成标识号;所述历史时间戳
为所述待生成标识号的历史生成标识号对应的时间戳;
生成标识号。
识号的时钟回拨次数之前,所述方法还包括:
骤之后,所述方法还包括:
刻对应的时钟回拨次数,所述第一初始序列号为所述初始时刻对应的序列号。
的第三号段之前。
指令的时刻;
生成标识号的时钟回拨次数;所述历史生成标识号为所述待生成标识号的前一已生成标识
号;所述历史时间戳为所述待生成标识号的历史生成标识号对应的时间戳;
号,生成所述待生成标识号。
数。
列号。
的时钟回拨次数;
数为所述初始时刻对应的时钟回拨次数,所述第一初始序列号为所述初始时刻对应的序列
号。
的第三号段之前。
通信;所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令,所述处理
器被所述机器可执行指令促使:实现本发明实施例第一方面提供的标识号生成方法的方法
步骤。
法的方法步骤。
此当工作机器发生时钟回拨的情况后,所生成的标识号的时间戳小于发生时钟回拨之前所
生成的标识号的时间戳,当工作机器检测到待生成标识号的时间戳小于历史时间戳时,能
够根据待生成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定待生成
标识号的时钟回拨次数,因此机器发生时钟回拨后生成的标识号的时钟回拨次数,与机器
发生时钟回拨前申城的标识号的时钟回拨次数不同,进而使得工作机器发生时钟回拨后所
生成的标识号,与工作机器发生时钟回拨前所生成的标识号不同,从而避免出现标识号重
复的问题。
附图说明
具体实施方式
数表示序列号。由于现有的snowflake算法生成的标识号的时间戳的最小计数单位可以为
41 10
毫秒,因此其可以表示的时间范围为2 /(3600*24*365*1000)≈69.7年;可以部署到2 =
12
1024台工作机器中,在一毫秒内同一个工作机器,可以容纳2 =4096个不同的标识号。表示
工作机器ID的二进制数的位数和表示序列号的二进制数的位数之和,决定了系统的并发能
力,即,现有的snowflake算法能够支持1024*4096=4194304个并发。
从十三点回拨到十二点,假设在时钟回拨之前,仅有十二点和十二点半分别生成一个标识
号,时钟回拨前十二点生成的标识号中的时间戳与十二点对应,时钟回拨前十二点半生成
的标识号的时间戳与十二点半对应。在生成标识号之前,通常先生成时间戳,并将该时间戳
与前一时刻生成的标识号的时间戳相比较,如果不相同时,则序列号从0开始计数,由于时
钟回拨后十二点生成的时间戳与十二点对应,小于时钟回拨前十二点半生成标识号的时间
戳,则时钟回拨后十二点生成的标识号的序列号从0开始计数,因此,可能出现时钟回拨后
在十二点生成的标识号与时钟回拨前在十二点生成的标识号相同的情况,即出现标识号重
复的问题。
的情况下,表明工作机器发生时钟回拨,则将历史生成标识号中的时钟回拨次数增加第一
预设数值,得到待生成标识号的时钟回拨次数。因此,发生时钟回拨后生成的标识号中的时
钟回拨次数,与时钟回拨前生成的标识号中的时钟回拨次数不同,即,发生时钟回拨后生成
的标识号与时钟回拨前生成的标识号不同,因此,能够避免出现标识号重复的问题。
根据需求预设的一个时刻,例如,用户通过相应的设置使工作机器从a1时刻开始生成标识
号,则该a1时刻即为初始时刻,即,a1时刻所对应的初始时间戳为0。
成时刻,相差一毫秒。因此,前述的a1时刻例如可以为12点第一毫秒。
初始时间戳,与当前时刻与初始时刻之间的差值相加得到,例如,初始时刻的a1时刻,当前
时刻为b0时刻,而第一初始时间戳通常为0,因此,待生成标识号的时间戳为b0‑a1。当时间
戳的最小计数单位为毫秒时,需要计算b0与a1之间相差多少毫秒,例如,当a1为12点的第一
毫秒,b0为12点第二毫秒,则待生成标识号的时间戳即为1。在计算出差值后将该相差的毫
秒数转换为二进制数,即可得到待生成标识号的时间戳。需要说明的是,初始时刻以及当前
时刻均为生成标识号的工作机器的本机时刻。
回拨次数。
时刻至时钟回拨之后的b1时刻之间没有生成其它标识号,当时钟回拨后b1时刻将要生成的
标识号为待生成标识号时,b0时刻所生成的标识号即为历史生成标识号,由于待生成标识
号的时间戳与b1时刻对应,历史生成标识号的时间戳与b0时刻对应,因此待生成标识的时
间戳小于历史生成标识号的时间戳,表明工作机器发生过时钟回拨并能够检测到时钟回
拨,该种情况下,可以将b0时刻生成的历史生成标识号的时钟回拨次数增加第一预设数值,
得到b1时刻生成的时钟回拨次数。
拨前所生成的标识号的时钟回拨次数。
小于工作机器发生时钟回拨前所生成的标识号的时钟回拨次数。
号。
工作机器对应的机器ID;可以通过预设的规则预先生成待生成标识号的序列号。将预设的
符号位、待生成标识号的时间戳、待生成标识号的时钟回拨次数、待生成标识号的预设机器
ID,以及待生成标识号预先生成的序列号组成待生成标识号。
在时钟回拨之前的某一时刻,例如b0时刻,生成标识号,在时钟回拨后相同的时刻(b0时刻)
再次生成标识号,而在时钟回拨后的b0时刻与时钟回拨之前的b0时刻之间没有生成标识
号;第二种情况,例如图3c,本机时钟发生过时钟回拨,但是并未检测到,即在时钟回拨之前
的某一时刻,例如b0时刻,生成标识号,在时钟回拨后晚于b0时刻的b2时刻再次生成标识
号,而在时钟回拨之前的b0时刻至时钟回拨之后的b2时刻之间没有生成标识号;第三种情
况,工作机器的本机时钟没有发生过时钟回拨。
将待生成标识号的时钟回拨次数确定为1。这样一来,可以最大化利用时钟回拨次数的资
源,避免资源的浪费。
器的时钟从十三点回拨至十二点,则工作机器在时钟回拨后,十二点所生成的标识号的时
间戳与十二点对应,工作机器在十三点生成的标识号的时间戳与十三点对应,因此,回拨至
十二点对应的时间戳小于十三点对应的时间戳,表明工作机器发生过时钟回拨。
到待生成标识号的时钟回拨次数。
二初始时间戳,该第二初始时间戳可以与第一初始时间戳相同,即为0。由于工作机器发生
时钟回拨后,生成的待生成标识号的时钟回拨次数大于历史生成标识号的时钟回拨次数,
因此,待生成标识号大于历史生成标识号。用于表示时间戳的第二号段位于用于表示时钟
回拨次数的第一号段之后,因此,待生成标识号的时间戳与历史生成标识号的时间戳之间
的大小关系,并不影响待生成标识号与历史生成标识号之间的大小关系。因此将待生成标
识号的时间戳更新为0,在不影响不同标识号之间的大小关系的情况下,即在不影响多个时
刻生成的不同标识号呈递增趋势的情况下,能够避免资源的浪费。
号的时间戳更新为第二初始时间戳所能达到的有益效果相同,本发明实施例此处不再赘
述。
刻,因此b2时刻所生成的历史生成标识号的历史时间戳,大于,b0时刻将要生成的待生成标
识号的时间戳,在该种情况下,在将历史生成标识号的时钟回拨次数确定为待生成标识号
的时钟回拨次数的同时,还可以将待生成标识号的序列号设置为0,这样一来,可以使工作
机器在新的时间戳下生成的标识号再次从0开始计算序列号,因此可以最大化利用序列号
的资源,避免资源的浪费,并且由于新的时间戳大于历史生成标识号的历史时间戳,因此待
生成标识号依然大于历史生成标识号。
的,因此历史生成标识号的时间戳与待生成标识号的时间戳相同,在该种情况下,可以将历
史生成标识号的序列号与第二预设数值相加,得到待生成标识号的序列号,此处的第二预
设数值可以为1。由于待生成标识号的时钟回拨次数与历史生成标识号的时钟回拨次数相
同,且两者的时间戳也相同,而待生成标识号的序列号大于历史生成标识号的序列号,因
此,待生成标识号大于历史生成标识号,也满足多个标识号呈递增趋势的要求。
时间戳所能表示的时间范围内均没有发生时钟回拨,或者发生如图4所示实施例中步骤
S310中所列的第一种情况和第二种情况。此时,则可以将待生成标识号的时钟回拨次数增
加第三预设数值,得到待生成标识号的新的时钟回拨次数。此处的第三预设数值可以为1。
因此待生成标识号大于历史生成标识号,因此可以将待生成标识号的时间戳更新为0,并建
立当前时刻与该时间戳的对应关系,其后生成标识号的时间戳可以基于当前时刻与其对应
的时间戳进行计算确定。在此基础上,还可以将待生成标识号的序列号设置为0。通过上述
S410~420的步骤,使得待生成标识号的时间戳达到预设的时刻时,还可以通过本发明实施
例的标识号生成方法继续生成标识号,由于所生成标识号的时钟回拨次数,与待生成标识
号的时间戳达到预设的时刻之前,所生成的标识号的时钟回拨次数不同,因此,在能够避免
出现标识号重复的问题的基础上,可以进一步增加本发明实施例提供的标识号生成方法所
生成标识号的总数量。
的,可以将表示符号位的号段、表示时钟回拨次数的号段、表示时间戳的号段、表示机器ID
的号段,以及表示序列号的号段分别设置为1位、10位、31位、10位以及12位二进制数。因此,
31
当时间戳的最小计数单位为毫秒时,时间戳可以表示的时间范围为2 /(3600*24*1000)≈
24.86天。假设工作机器在生成标识号的过程中,均没有发生时钟回拨,每当待生成标识号
的时间戳达到预设的时刻时,并且当序列号达到预设的数量时,可以通过将待生成标识号
的时钟回拨次数加一,并将时间戳和序列号分别设置为0,则时间戳所能表示的时间范围为
10
24.86*2 /365≈69.7年,在该种情况下,本发明实施例提供的生成标识号的方法所能生成
的标识号的总数量,与现有的snowflake算法所能生成后的标识号的总数量相同。此处需要
说明的是,序列号达到预设的数量可以指,表示序列号的号段的二进制数满位,即该二进制
数每一位的数字均为1。
因此,可以将预设的符号位设置为0,而且该预设的符号位位于标识号的最高位。
趋势,因此可以将第一初始序列号设置为0。
限定,示例性的,通常为了保证工作机器所生成的标识号呈递增趋势,可以将表示序列号的
第三号段设置在表示时间戳的第二号段之后。
于用于表示序列号的第三号段之前。将用于表示时钟回拨次数的第一号段设置在用于表示
时间戳的第二号段之前,使得同一工作机器采用本发明实施例提供的方法,生成的标识号
可以基于长整型判断标识号的大小。即,在判断同一工作机器生成的标识号的过程中,符号
位都相同,因此可以直接判断时钟回拨次数,时钟回拨次数越大,则表明该标识号也越大,
当时钟回拨次数相同时,表明在生成这两个标识号的时间段内,工作机器没有发生时钟回
拨,则较大的时间戳对应的标识号较大。
器发生时钟回拨的情况后,所生成的标识号的时间戳小于发生时钟回拨之前所生成的标识
号的时间戳,当工作机器检测到待生成标识号的时间戳小于历史时间戳时,能够根据待生
成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定待生成标识号的时
钟回拨次数,因此机器发生时钟回拨后生成的标识号的时钟回拨次数,与机器发生时钟回
拨前申城的标识号的时钟回拨次数不同,进而使得工作机器发生时钟回拨后所生成的标识
号,与工作机器发生时钟回拨前所生成的标识号不同,从而避免出现标识号重复的问题。
的时钟回拨次数;历史生成标识号为待生成标识号的前一已生成标识号;历史时间戳为待
生成标识号的历史生成标识号对应的时间戳。
识号。
次数。
数为初始时刻对应的时钟回拨次数,第一初始序列号为初始时刻对应的序列号。
于用于表示所述序列号的第三号段之前。
器发生时钟回拨的情况后,所生成的标识号的时间戳小于发生时钟回拨之前所生成的标识
号的时间戳,当工作机器检测到待生成标识号的时间戳小于历史时间戳时,能够根据待生
成标识号的历史生成标识号的时钟回拨次数与第一预设数值之和,确定待生成标识号的时
钟回拨次数,因此机器发生时钟回拨后生成的标识号的时钟回拨次数,与机器发生时钟回
拨前申城的标识号的时钟回拨次数不同,进而使得工作机器发生时钟回拨后所生成的标识
号,与工作机器发生时钟回拨前所生成的标识号不同,从而避免出现标识号重复的问题。
704完成相互间的通信。
生成标识号为待生成标识号的前一已生成标识号;历史时间戳为待生成标识号的历史生成
标识号对应的时间戳。
所生成的标识号的时间戳小于发生时钟回拨之前所生成的标识号的时间戳,当工作机器检
测到待生成标识号的时间戳小于历史时间戳时,能够根据待生成标识号的历史生成标识号
的时钟回拨次数与第一预设数值之和,确定待生成标识号的时钟回拨次数,因此机器发生
时钟回拨后生成的标识号的时钟回拨次数,与机器发生时钟回拨前申城的标识号的时钟回
拨次数不同,进而使得工作机器发生时钟回拨后所生成的标识号,与工作机器发生时钟回
拨前所生成的标识号不同,从而避免出现标识号重复的问题。
Architecture,EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便
于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
以是至少一个位于远离前述处理器的存储装置。
Processing,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现
场可编程门阵列(Field‑Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立
门或者晶体管逻辑器件、分立硬件组件。
成方法的步骤。
产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或
部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计
算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质
中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机
指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字
用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或
数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者
是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以
是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘
Solid State Disk(SSD))等。
在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖
非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要
素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备
所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在
包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
内。