我在 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 ;
Run Code Online (Sandbox Code Playgroud)
我已在此表中插入 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 ;
Run Code Online (Sandbox Code Playgroud)