为MySql生成完全不同的UUID

我在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:

  • ae353781-9022-11ea-b775-1866daed31d4
  • ae353a23-9022-11ea-b775-1866daed31d4
  • ae353b4e-9022-11ea-b775-1866daed31d4
  • ae353c26-9022-11ea-b775-1866daed31d4

除了3位数字外,这些基本上都是相同的UUID。

当插入新记录时,如何生成表唯一的完全不同的UUID?

gview

要回答您的问题,是的,guid或uuid并非难以预测。它仅设计为唯一的,这是一项艰巨的任务。

拥有如此大的主键确实会占用空间,从而降低性能。

除了不得已,我不会推荐它。通常,人们在事先计划将数据分片到多个表中时,会使用guid作为键。

反对这样做的另一个论点是,混淆不是安全。如果从安全的角度来看存在问题,某人看到了他们不应看到的东西,因为他们用例如url访问了id=3,那么如果url是则存在同样的问题id=ae353c26-9022-11ea-b775-1866daed31d4id=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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Random使Java中生成的数字完全不同?

为什么gcc和clang会为成员函数模板参数生成完全不同的代码?

浏览器将指定的href超级链接解释为完全不同的url

RestKit对象映射将ID映射为完全不同的负数

从 Firebase 检索完全不同的密钥

完全不同的手机视图

ResolveMethod()返回完全不同的方法

回声以完全不同的方式工作

以完全不同的格式混合数据

Unity PC版与Android完全不同

Mapbox 相机去到完全不同的位置

1条语句mysql中2个完全不同的查询

MySQL将数据迁移到完全不同的数据库结构并保持关系完整

MySQL为多行插入中的不同行设置不同的UUID

IDA 反汇编为 Visual Studio 2017 中编译的 exe 生成与 ASM 文件完全不同的代码

是否可以在 url 中为 Azure 中的部署槽定义一个完全不同的子域?

为两个完全不同的类创建单个比较器是一种不好的做法吗?

OpenGL的实现在不同平台上是否完全不同?

不同版本的sklearn提供了完全不同的训练结果

为什么接口类型被认为与重载完全不同?

(似乎)相同的代码完全不同地运行

RSS Feed与浏览器中的显示完全不同

这些是同义的,彼此子集的还是完全不同的?

Buffer.byteLength返回完全不同的字节长度

Swift中的阴影与Sketch中的阴影完全不同

通用应用中iPad的UI完全不同

两个相同的剃刀视图的行为完全不同

从函数返回完全不同的数据类型

timeit及其default_timer完全不同意