MySQL:使用附加HASH字段的UNIQUE文本字段

时间:2012-10-02 21:48:42

标签: mysql cryptography md5 sha256 unique-key

在我的MySQL数据库中,我有一个表定义如下:

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

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

我知道还不可能为blobtext字段的整个值定义唯一索引,但是有一个票证(?)打开来实现这样的功能(参见{ {3}})建议使用散列创建一个唯一键,就像它已经为其他字段实现一样。

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

我看了一下创建这个哈希的可能方法,因为我想避免冲突(我需要插入几百万个条目),看起来RIPEMD-160算法是最好的算法,即使是快速搜索给了我几个使用SHA256甚至SHA1和MD5的类似解决方案。

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

我的另一个问题是:MySQL目前使用哪种算法来创建哈希?

1 个答案:

答案 0 :(得分:4)

让我们看看你的要求:

您需要确保值字段是唯一的。值字段是一个文本列,由于它的性质,无法在值字段上创建唯一索引(暂时)。所以使用一个额外的字段,这是字段值的哈希值,这是你唯一真正的选择。

这种方法的优点:

  1. 易于计算哈希。
  2. 为两个不同的值创建重复哈希极为罕见,因此您的哈希值几乎可以保持不变。
  3. 哈希通常是一些可以有效索引的数值(表示为十六进制)。
  4. 散列不会占用大量空间,不同的散列函数会返回不同长度的散列,因此可以使用不同的算法进行测试,并测试它们以找到适合您需要的算法。
  5. 这种方法的缺点:

    1. 在INSERTS和UPDATES期间需要额外的字段,即还有更多的工作要做。
    2. 如果您已经在表格中有数据并且这个数据正在制作中,您将不得不更新当前数据,并希望您没有重复数据。此外,运行更新还需要一些时间。因此,在已经正常工作的系统中应用更改可能会很棘手。
    3. 散列函数是CPU密集型的,可能会对CPU使用率产生负面影响。
    4. 我假设您了解哈希函数的作用以及概念上它是如何工作的。

      您可以在此处找到加密功能列表: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);
      

      与everythig new一样,你应该尝试所有的方法,找到最适合你的方法。