具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在背景技术中已经提到,目前生成唯一随机字符串时,是采用后验方式(先生成随机字符串,再校验该随机字符串是否唯一),确保生成并保留下的随机字符串的唯一性。对于某次生成的随机字符串,若该随机字符串与已保留的任一随机字符串相同,则将该次生成的随机字符串丢弃,在这种情况下,不仅效率很低,而且还浪费了用于生成随机字符串的资源。
为了解决以上问题,在本申请实施例中,可以在生成随机字符串的过程的源头处就采取措施,使得生成的随机字符串是唯一的。这样的话,可以不用在生成随机字符串后再进行校验,不仅效率较高,而且也不会浪费用于生成随机字符串的资源。下面进行具体说明。
图1为本申请实施例提供的随机字符串生成方法的过程,该过程的执行主体可以是终端或服务器。所述终端包括但不限于:个人计算机、手机、平板电脑、智能手表、车载移动台等;所述服务器包括但不限于:个人计算机、大中型计算机、计算机集群等。执行主体并不构成对本申请的限定,为了便于描述,本申请实施例均以执行主体是服务器为例进行说明。
在本申请实施例中,图1中的过程可以是生成一个唯一随机字符串的过程,在实际应用中,可以通过多次执行该过程,获取到多个互不相同的随机字符串。该过程可以是在单点环境下执行的,也可以是在分布式环境下执行的,等等;本申请实施例对该过程的执行环境并不做限定。
该过程具体可以包括以下步骤:
S101:获取数据库中的sequence变量的值,其中,所述sequence变量的值为由预定基本数字集合中的基本数字构成的序列,本次获取到的所述sequence变量的值与本次之外的任一次获取到的所述sequence变量的值均不相同。
在本申请实施例中,sequence变量可以是数据库中的、任一已定义的sequence变量。sequence变量可以是为了实现生成随机字符串的功能专门定义的,也可以是原本为了实现其他功能定义的,本申请实施例对此并不做限定。所述数据库包括但不限于:Oracle、DB2、PostgreSQL等数据库。
sequence变量一般可以作为数据库中的主键(Primary Key)。当采用数据库提供的特定指令获取sequence变量的值时,可以使得每次获取到的该sequence变量的值均不相同。所述特定指令可以是用于让sequence变量按照预设自增步长,自增后再取值的指令,如NextVal指令。
在本申请实施例中,可以基于每次获取的sequence变量的值的唯一性,保证根据该次获取的sequence变量的值,对应生成的随机字符串的唯一性。
由于上述的特定指令是数据库已经实现的功能部分,因此,在实施本申请的方案时,并不需要我们自己开发额外的功能模块,以用于保证在步骤S101中每次获取的sequence变量的值互不相同,从而可以减小本申请的方案的实施成本。
在本申请实施例中,sequence变量是数值型变量。对于数值型变量,其值可以采用10进制进行表示,也可以采用2进制、8进制、16进制等进制进行表示。以一个变量名称为“seq”的sequence变量为例进行说明。
在10进制下,假定seq=123,则基于10进制对应的基本数字集合(包含的基本数字为:10进制数字0~9),可以将seq的值表示为由10进制数字1、2、3构成的序列“123”,也即,10进制数123;而在2进制下,基于2进制对应的基本数字集合(包含的基本数字为:2进制数字0、1),可以将seq的值表示为由2进制数字0、1构成的序列“01111011”,也即,2进制数01111011;类似的,还可以基于8进制、16进制等,对seq的值进行表示,在此不一一赘述。
根据上面的说明,步骤S101中的所述预定基本数字集合可以是一种预定的数字进制对应的基本数字集合,相应的,sequence变量的值可以是该基本数字集合中的基本数字构成的序列。
S102:根据设定的字符集合中包含的各字符与所述基本数字集合中包含的各基本数字的一一映射关系,将所述序列映射为字符串,作为生成的随机字符串。
在本申请实施例中,字符集合中包含的各字符的数量与基本数字集合中包含的各基本数字的数量可以相同,且各字符可以互不相同,各基本数字可以互不相同,这样的话,可以成功地设定各字符与各基本元素之间的一一映射关系。
字符集合和/或一一映射关系可以是在执行步骤S101之前设定的,也可以是在执行步骤S101之后设定的。对于前一种情况,在执行步骤S101时,由于字符集合是先于sequence变量的值确定的,为了保证可以成功设定字符集合与sequence变量的值对应的基本数字集合的一一映射关系,可以根据字符集合中包含的各字符的数量,确定用于表示sequence变量的值的基本数字集合(该基本数字集合中包含的基本数字的数量应与各字符的数量相等);类似地,对于后一种情况,则可以根据步骤S101中用于表示sequence变量的值的基本数字集合包含的各基本数字的数量,设定字符集合。
另外,在实际应用中,序列映射为字符串后,还可以按照预定规则,在该字符串头部、中部或尾部插入其他的字符,再将插入后的该字符串作为生成的随机字符串,在这种情况下,序列映射的字符串可以是生成的随机字符串的一部分。需要说明的是,插入的其他的字符应当不影响生成的随机字符串的唯一性。
在本申请实施例中,除了可以采用设定的字符集合映射所述序列以外,类似地,也可以采用设定的字符串集合映射所述序列,生成随机字符串。在这种情况下,可以将步骤S102替换为以下步骤:根据设定的字符串集合中包含的各字符串与所述基本数字集合中包含的各基本数字的一一映射关系,将所述序列映射为字符串,作为生成的随机字符串。
通过上述方法,由于每次获取到的sequence变量的值均不相同,相应的,每次根据所述一一映射关系映射生成的随机字符串也均不相同,因此,不必再执行多次对比字符串的操作,从而可以提高生成唯一随机字符串的效率,而且也可以节省服务器的资源。不仅如此,由于数据库已经提供了特定指令,用于使每次获取到的sequence变量的值均不相同,因此,本申请的方案的实施成本较小,有利于在更多的适用场景下实施。
为了便于理解,下面对图1中的步骤进一步地进行说明。
在本申请实施例中,不同的业务对生成的随机字符串的复杂程度的需求可能不同。例如,在对于某个业务,生成仅包含有英文字母的随机字符串即可满足需求,而对于另一个业务,需要生成的随机字符串不仅可以包含英文字母,还可以包含数字、标点等其他类型的字符。
因此,可以根据诸如以上的需求,先设定符合需求的字符集合,再执行图1中的各步骤。在这种情况下,可以根据设定的字符集合,确定出可以与该字符集合一一映射的基本数字集合,以用于对步骤S101中的sequence变量的值进行表示。
当然,若对生成的随机字符串的复杂程度的并没有特别需求的话,也可以在获取sequence变量的值后,再根据表示该值的基本数字集合,生成与该基本数字集合可以一一映射的字符集合。
在本申请实施例中,服务器可以只为一个业务生成随机字符串,也可以分别为多个业务生成随机字符串。对于后一种情况,多个业务都有获取唯一随机字符串的需求,由于对这多个业务中的每个业务,一般只在该业务的范围内使用的获取的各随机字符串,因此,服务器可以针对每个业务,分别为该业务生成在该业务的范围内具有唯一性的随机字符串即可,而不一定要保证服务器生成的所有的随机字符串是全局唯一的。
根据对上述的后一种情况的分析,对于步骤S101,获取数据库中的sequence变量的值,具体可以包括:接收随机字符串生成请求;根据所述生成请求的类型,从数据库中的至少一个sequence变量中,确定预定的、与该类型对应的sequence变量;获取所述与该类型对应的sequence变量的值,其中,本次获取到的所述sequence变量的值与本次之外的任一次获取到的所述与该类型对应的sequence变量的值均不相同。
随机字符串生成请求可以来自需要获取随机字符串业务,不同的业务的生成请求的类型可以不同,每种类型的生成请求可以分别对应于一个sequence变量(该对应关系可以是预先设定的,也可以是在接收到生成请求后再设定的),各sequence变量的变量名称互不相同,进而可以通过变量名称对各sequence变量进行区分。
由此可见,服务器可以基于不同的sequence变量,分别为不同的业务生成在对应的业务范围内具有唯一性的随机字符串。这样的话,可以防止各sequence变量与过多数量的业务产生关联,从而便于对各sequence变量进行管控。
当然,在实际应用中,一个sequence变量也可以由多个业务共用,用于为所述多个业务生成随机字符串,从而可以减少数据库的开销。在这种情况下,基于这个sequence变量生成的各随机字符串在所述多个业务的范围内具有唯一性。
进一步的,若服务器分别为多个业务生成随机字符串,则针对不同的业务设置的字符集合也可以不同。进而,服务器在获取某业务对应的sequence变量的值后,可以基于为该业务设定的字符集合,为该业务生成随机字符串。
在本申请实施例中,对于步骤S102,将所述序列映射为字符串,具体可以包括:针对所述序列中的各基本数字,分别将每个基本数字转换为所述字符集合中包含的、与该基本元素映射的字符;按照转换出的各字符在转换后的所述序列中的顺序,将所述各字符进行串接构成字符串。下面沿用上述的sequence变量seq举例进行说明。
例如,seq为序列“123”,假定在设定的字符集合中,与基本数字“1”映射的字符为‘@’,与基本数字“2”映射的字符为‘#’,与基本数字“3”映射的字符为‘$’。这三个字符可以顺序串接为“@#$”,则可以将序列“123”映射为字符串“@#$”。
在本申请实施例中,若先设定了字符集合,再获取sequence变量的值,则可能需要对该值在进制上进行转换,以使得用于表示转换后该值的基本数字集合可以与设定的字符集合一一映射。
具体的,当所述字符集合中包含的字符的数量为N时,所述预定基本数字集合中为N进制对应的基本数字集合,包括的基本数字为:整数0~N-1;其中,N为不小于2的整数。在这种情况下,对于步骤S101,获取数据库中的sequence变量的值,其中,所述sequence变量的值为由预定基本数字集合中的基本数字构成的序列,具体可以包括:获取数据库中的sequence变量的值;当确定获取的所述sequence变量的值不为N进制数时,将所述序列号sequence变量的值转换为N进制数,所述N进制数为由N进制对应的基本数字集合中的基本数字构成的序列。下面举例进行说明。
例如,假定设定的字符集合为{‘r’、‘7’、‘d’、‘m’、‘g’、‘a’、‘x’、‘3’},包含8个字符(也即,N=8),可以设定该字符集合中包含的各字符,与由8进制对应的基本数字集合{‘0’、‘1’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’}中包含的各基本数字之间的一一映射关系。假定设定的一一映射关系表示为:{(‘r’,‘0’);(‘7’,‘1’);(‘d’,‘2’);(‘m’,‘3’);(‘g’,‘4’);(‘a’,‘5’);(‘x’,‘6’);(‘3’,‘7’)},其中,每个括号中包含一个映射对,每个映射对包含相互映射的、该字符集合中包含的一个字符与该基本数字集合中的一个基本数字。
假定本次获取到的sequence变量的值为10进制数11002,而不是为8进制数,则可以将该10进制数11002转换为8进制数25372,也即,基于8进制对应的基本数字集合可以将sequence变量的值表示为序列“25372”。进而,可以根据该字符集合和所述一一映射关系,将序列“25372”转换为字符串“dam3d”,作为本次生成的随机字符串。
在本申请实施例中,每次执行步骤S101时,都可以采用用于让sequence变量自增后再取值的指令,获取所述sequence变量的值,以使得每次获取的所述sequence变量的值互不相同。前面已经提到,目前在大多数数据库中,用于让sequence变量自增后再取值的指令可以是NextVal指令。需要说明的是,本申请实施例对该指令的名称并不做限定,“NextVal”是该指令的名称的一种示例。
以上是对图1中的各步骤的进一步说明。为了便于理解,下面对在实际应用场景下,对本申请实施例提供的随机字符串生成方法的一种实施过程进行举例说明。
假定数据库中的sequence变量的值默认为10进制数,设定的字符集合中包含的字符数量为N,且该字符集合用数组的形式预先进行创建和保存。如图2所示,该过程可以包括以下步骤:
S201:创建长度为N的数组,假定N不为10,该数组中包含有N个互不相同的字符。
仍沿用上例中的字符集合和一一映射关系,可以用以下指令创建该数组:
char[]digit={‘r’,‘7’,‘d’,‘m’,‘g’,‘a’,‘x’,‘3’}。
S202:采用NextVal指令获取数据库的sequence变量的值,其中,该值为10进制数。
假定获取到的sequence变量的值为10进制数11002。
S203:将获取的sequence变量的值由10进制数转换为N进制数。
假定N=8,则转换后的sequence变量的值为8进制数25372,对应的序列为“25372”。
需要说明的是,若N=10,则步骤S203也可以省略,不必执行。
S204:根据设定的该数组中包含的各字符与N进制对应的基本数字集合中包含的各基本数字的一一映射关系,将转换得到N进制数字对应的序列映射为字符串,作为生成的随机字符串。
将序列“25372”可以映射为字符串“dam3d”,作为生成的随机字符串。
进一步的,本申请实施例还提供了可用于实现图2中的过程的一种系统的结构图,如图3所示。
该系统可以包含外围、服务层、算法层和数据库层。各层的处理逻辑可以在同一个设备(如服务器)上实现,也可以在不同的设备上实现。
图3中的箭头线段可以表示在生成随机字符串的过程的处理逻辑的执行顺序,箭头线段的两端连接的方框内是对该过程中的步骤的描述。主要可以包括以下步骤:
外围设备向服务层发送随机字符串生成请求;
服务层响应于该生成请求,采用NextVal指令从数据库层获取预定的、与该生成请求的类型对应的sequence变量的值,并返回给服务层;
服务层将sequence变量的值传递给算法层;
算法层基于预先设定的字符集合,将sequence变量的值对应的序列映射生成随机字符串,并返回给服务层;
服务层将生成的随机字符串,以及其他相关信息发送给数据库,以便于数据库写入和保存这些数据;
服务层将生成的随机字符串返回给外围;
外围获得生成的随机字符串,至此,该过程结束。
当然,图3是举例说明的可用于实施本申请实施例提供的方法的一种系统的结构图,在实际应用中,还可以有用于实施所述方法的、与该系统结构不同的其他系统,本申请实施例对可用于实施所述方法的系统的结构并不做限定。
在实际应用中,除了数据库的sequence变量以外,类似的,也可以用其他特定变量替换sequence变量,用于实施本申请的方案。例如,所述其他特定变量可以是用于记录系统时间的毫秒数的变量、或专门为生成随机字符串定义及维护的变量,等等。
需要说明的是,若采用其他特定变量实施本申请的方案时,在每次获取sequence变量的值之后,可能要对该sequence变量执行变更操作,以使得下一次获取的该sequence变量的值,与除了所述下一次以外的任一次获取的该sequence变量的值均不相同。对于不同的特定变量,实现所述变更操作所耗费的成本也可能不同,在实际应用中,可以选择使用的特定变量实施本申请的方案。
以上为本申请实施例提供的随机字符串生成方法,基于同样的思路,本申请实施例还提供相应的随机字符串生成装置,如图4所示。
图4为本申请实施例提供的随机字符串生成装置结构示意图,具体包括:
获取模块401,用于获取数据库中的序列号sequence变量的值,其中,所述sequence变量的值为由预定基本数字集合中的基本数字构成的序列,本次获取到的所述sequence变量的值与本次之外的任一次获取到的所述sequence变量的值均不相同;
生成模块402,用于根据设定的字符集合中包含的各字符与所述基本数字集合中包含的各基本数字的一一映射关系,将所述序列映射为字符串,作为生成的随机字符串。
所述获取模块401具体可以用于:接收随机字符串生成请求;根据所述生成请求的类型,从数据库中的至少一个sequence变量中,确定预定的、与该类型对应的sequence变量;获取所述与该类型对应的sequence变量的值,其中,本次获取到的所述sequence变量的值与本次之外的任一次获取到的所述与该类型对应的sequence变量的值均不相同。
当所述字符集合中包含的字符的数量为N时,所述预定基本数字集合为N进制对应的基本数字集合,包括的基本数字为:整数0~N-1;其中,N为不小于2的整数;
所述获取模块401具体可以用于:获取数据库中的sequence变量的值;当确定获取的所述sequence变量的值不为N进制数时,将所述sequence变量的值转换为N进制数,所述N进制数为由N进制对应的基本数字集合中的基本数字构成的序列。
所述生成模块具体可以用于:针对所述序列中的各基本数字,分别将每个基本数字转换为所述字符集合中包含的、与该基本数字映射的字符;按照转换出的各字符在转换后的所述序列中的顺序,将所述各字符进行串接构成字符串。
所述获取模块具体可以用于:采用用于让sequence变量自增后再取值的指令,获取所述sequence变量的值。
在实际应用中,所述指定变量可以为指定数据库的序列sequence变量,也可以为用于记录系统时间的毫秒数的变量等其他特定变量。
具体的上述如图4所示的装置可以位于终端、服务器上。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。