MySQL:使用其他HASH字段的UNIQUE文本字段

Gio*_*lia 2 mysql md5 cryptography sha256 unique-key

在我的MySQL DB中,有一个定义如下的表:

CREATE TABLE `mytablex_cs` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `tag` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '',
  `value` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  KEY `kt` (`tag`),
  KEY `kv` (`value`(200))
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Run Code Online (Sandbox Code Playgroud)

我需要在value字段上实现UNIQUE约束(键)。

我知道尚无法在blobor或text字段的整个值上定义唯一索引,但是建议使用一个工单(?)来实现此功能(请参阅本页),建议使用以下方法创建唯一键:像已经为其他字段实现的哈希。

现在,我想使用一种类似的方法向表中添加另一个包含哈希的字段,并在该字段上创建唯一键。

我介绍了创建此哈希的可能方法,并且由于我想避免冲突(我需要插入几百万个条目),因此即使快速搜索给出,RIPEMD-160算法似乎也是最好的算法我有几种使用SHA256甚至SHA1和MD5的类似解决方案。

我完全缺乏密码学知识,那么选择这种方法的缺点是什么?

我有另一个问题:MySQL当前使用哪种算法创建哈希?

Nam*_*ian 6

让我们看看您的要求:

您需要确保值字段是唯一的。value字段是一个文本列,由于其性质,目前无法在value字段上创建唯一索引。因此,在此处,使用额外的字段作为字段值的哈希是您唯一的选择。

这种方法的优点:

  1. 轻松计算哈希。
  2. 为两个不同的值创建重复的哈希值非常罕见,因此您的哈希值几乎被保证是毫无歧义的。
  3. 哈希通常是一些可以被有效索引的数值(以十六进制表示)。
  4. 这些哈希不会占用很多空间,不同的哈希函数会返回不同长度的哈希,因此请尝试使用不同的算法并对它们进行测试,以找到适合您需求的算法。

这种方法的缺点:

  1. 在插入和更新期间需要额外的字段,即还有更多工作要做。
  2. 如果表中已经有数据并且正在生产中,则必须更新当前数据,并希望您没有重复的数据。另外,运行更新将需要时间。因此,将更改应用于已经运行的系统可能很棘手。
  3. 散列函数占用大量CPU,可能会对CPU使用率产生负面影响。

我假设您了解哈希函数的作用以及概念上的工作原理。

您可以在此处找到加密功能列表:http : //dev.mysql.com/doc/refman/5.5/en//encryption-functions.html

据我所知,MySQL支持MD5,SHA,SHA1和SHA2哈希函数。如果不是全部,那么大多数(即使不是全部)对于散列也应该足够。诸如MD5之类的某些功能在密码学应用程序中使用时(即在PKI中将其用作签名算法等时)存在一些问题。但是,当您决定使用它来创建唯一值时,这些问题并不那么重要,因为它实际上并没有被应用在这里的加密上下文中。

要使用MySQL哈希函数,您可以尝试以下示例:

SELECT MD5('1234')
SELECT SHA('1234')
SELECT SHA1('1234')
SELECT SHA2('1234',224);
Run Code Online (Sandbox Code Playgroud)

与newthig一样,您应该尝试所有方法并找到最适合您的方法。