我在SO上也看到了其他类似的问题,但是我在这里要问的却没有在那里回答。
GUID
我的表上有一个称为主键的字段。
我希望每次插入记录时都用随机UUID填充此字段。
因此,我创建了此表:
CREATE TABLE `myTable` (
`id` int(6) NOT NULL,
`first_name` varchar(64) NOT NULL,
`last_name` varchar(64) NOT NULL,
`GUID` char(40) NOT NULL,
PRIMARY KEY(`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
DELIMITER //
CREATE TRIGGER `t_GUID` BEFORE INSERT ON `myTable`
FOR EACH ROW begin
SET new.GUID := (SELECT uuid());
END //
DELIMITER ;
我在此表中插入了4条新记录,这些是添加到条目中的UUID:
除了3位数字外,这些基本上都是相同的UUID。
当插入新记录时,如何生成表唯一的完全不同的UUID?
要回答您的问题,是的,guid或uuid并非难以预测。它仅设计为唯一的,这是一项艰巨的任务。
拥有如此大的主键确实会占用空间,从而降低性能。
除了不得已,我不会推荐它。通常,人们在事先计划将数据分片到多个表中时,会使用guid作为键。
反对这样做的另一个论点是,混淆不是安全。如果从安全的角度来看存在问题,某人看到了他们不应看到的东西,因为他们用例如url访问了id=3
,那么如果url是则存在同样的问题id=ae353c26-9022-11ea-b775-1866daed31d4
。id=3
如果某人无法访问该应用程序,则该应用程序不应允许其访问。
话虽如此,用于这种类型的方案的一种解决方法是对输入进行哈希处理。
您可以将uuid与该行中的一些数据(可能还有一个时间戳)以及一些随机的数据串联在一起,并通过例如sha1()运行它。它将产生一个大的40个字符的十六进制字符串。
有可能发生碰撞,因此您可能要检查一下并从中恢复。
CREATE TABLE `myTable` (
`id` int(6) NOT NULL,
`first_name` varchar(64) NOT NULL,
`last_name` varchar(64) NOT NULL,
`GUID` char(40) NOT NULL,
PRIMARY KEY(`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
DELIMITER //
CREATE TRIGGER `t_GUID` BEFORE INSERT ON `myTable`
FOR EACH ROW begin
SET new.GUID := (SELECT SHA1(CONCAT(new.first_name, RAND(), UUID(), new.last_name, NOW())));
END //
DELIMITER ;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句