数据库中已有一个user的id,为什么还要弄一个uuid

数据库中已有一个user的id,为什么还要弄一个uuid,第1张

这个可能性很多:

一种可能是编写程序的人不喜欢将数据库主键直接暴露给终端用户查询,才会另外设置一个唯一ID。

还有可能是程序需要用这个UUID登录,但通常这个ID不能设为中文,这样可以让中文的昵称可以随意修改。

当然还有可能是需要通过一些协议进行交互的标志,比如通过新浪会员验证进来就有一个唯一的ID标志。

myssqli和mysql的函数是差不多的, 只不过, mysqi可以用对象方式

//过程方式:

 $Con = mysqli_connect('数据库服务器地址', '数据库登陆用户', '数据库密码');

 mysqli_select_db( $Con, '数据库名称');

 

//对象方式

$Con = new mysqli('数据库服务器地址', '数据库登陆用户', '数据库密码', '数据库名称');

同样是过程方式,mysqli有一点和mysql的用法不同的是,:

mysql函数,很多函数都有2个参数,一个是sql语句等, 一个是mysql连接标识, 而这个mysql连接标识参数是可以省略的!

但是mysqli两个参数必须, 而且顺序相反, 比如:

mysql_query('show tables', $Con ); 

//也可以省略第二个参数,写成:

mysql_query('show tables');

//但是mysqli不行

mysqli_query( $Con,  'show tables');

// 如果使用的JDK15的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:

javautilUUID,直接调用即可

UUID uuid = UUIDrandomUUID();

String s = UUIDrandomUUID()toString();//用来生成数据库的主键id非常不错。。

//UUID是由一个十六位的数字组成,表现出来的形式例如

//550E8400-E29B-11D4-A716-446655440000

从思路上来讲应该比较简单吧,可以借助java的UUID来实现随机码,如果嫌长就想法变短。如果只使用一次,就是该码如果有人注册过了,就将该码的状态标志位置为1,代表已使用。说起来这有点像会员卡充值的意思,就像京东E卡一样。如果实现得具体问题具体对待吧。

以前对UUID的了解很少,只知道是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier)。

刚才google了下,算是有了点深入的了解。

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。

使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。

我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的KeyGenerator,也可能是我们下面要说的UUID。

据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:

mysql> select uuid();

+--------------------------------------+

| uuid() |

+--------------------------------------+

| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |

+--------------------------------------+

现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。

优点:

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。

保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

缺点:

比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。

使用UUID后,URL显得冗长,不够友好。

下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨,但需要注意的一点数据在索引的时候效率会随着体积的增加而降低。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/orderPHP/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现URL是/orderphp/id/1000,晚上再下一个订单发现URL是/orderphp/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。

效率?

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专门的UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键,一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试,另外,UUID做主键的效率和UUID本身的算法实现也有很大关系。

另外,对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。

我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

用UUID本身就有问题把,UUID保证的同一时刻每台电脑生成的字符串不重复,不保证同一时刻相同电脑生成的不相同吧?

为什么不对附件求sha-1 把 附件的sha-1作为文件名啊,这样就是重复了也是相同的文件才重复啊。

以上就是关于数据库中已有一个user的id,为什么还要弄一个uuid全部的内容,包括:数据库中已有一个user的id,为什么还要弄一个uuid、php不能像mysql那样直接用uuid生成唯一标识码吗、关于请问如何用java生成一个指定长度的UUID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9364558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存