2)9~16位采用底层的IP地址,在服务器集群中的惟一性;
3)17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
4)25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。
通过以上4种策略可以保证惟一性。在系统中需要用到随机数的地方都可以考虑采用UUID算法。
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。
UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。
// 如果使用的JDK15的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:javautilUUID,直接调用即可
UUID uuid = UUIDrandomUUID();
String s = UUIDrandomUUID()toString();//用来生成数据库的主键id非常不错。。
//UUID是由一个十六位的数字组成,表现出来的形式例如
//550E8400-E29B-11D4-A716-446655440000uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现。有时也称guid(global unique identifier)。python中自带了uuid模块来进行uuid的生成和管理工作。(具体从哪个版本开始有的不清楚。。)
python中的uuid模块基于信息如MAC地址、时间戳、命名空间、随机数、伪随机数来uuid。具体方法有如下几个:
uuiduuid1()基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性。
uuiduuid2()算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。不过需要注意的是python中没有基于DCE的算法,所以python的uuid模块中没有uuid2这个方法。
uuiduuid3(namespace,name)通过计算一个命名空间和名字的md5散列值来给出一个uuid,所以可以保证命名空间中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了。感谢评论区大佬指出namespace并不是一个自己手动指定的字符串或其他量,而是在uuid模块中本身给出的一些值。比如uuidNAMESPACE_DNS,uuidNAMESPACE_OID,uuidNAMESPACE_OID这些值。这些值本身也是UUID对象,根据一定的规则计算得出。
uuiduuid4()通过伪随机数得到uuid,是有一定概率重复的
uuiduuid5(namespace,name)和uuid3基本相同,只不过采用的散列算法是sha1
一般而言,在对uuid的需求不是很复杂的时候,uuid1方法就已经够用了,使用方法如下:
"""
import uuid
name = 'test_name'
namespace = uuidNAMESPACE_URL
print uuiduuid1()
print uuiduuid3(namespace,name)
print uuiduuid4()
print uuiduuid5(namespace,name)
"""// 如果使用的JDK15的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:
javautilUUID,直接调用即可
UUID uuid = UUIDrandomUUID();
String s = UUIDrandomUUID()toString();//用来生成数据库的主键id非常不错。。
//UUID是由一个十六位的数字组成,表现出来的形式例如
//550E8400-E29B-11D4-A716-446655440000set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS rand_string;
DELIMITER $$
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END $$
DELIMITER ;
经测试,函数创建后与当前数据库绑定,下面语句可以查看函数相关信息。
复制代码代码如下:
SHOW FUNCTION STATUS WHERE Db='database_name';
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)