【问题标题】:MySQL: UNIQUE text field using additional HASH fieldMySQL:使用附加 HASH 字段的唯一文本字段
【发布时间】:2012-10-02 21:48:41
【问题描述】:

在我的 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 字段上实现唯一约束(键)。

我知道目前还不可能为 blobtext 字段的整个值定义唯一索引,但是有一个票(?)可以实现这样的功能(请参阅this page),其中建议使用散列创建唯一键,就像其他字段已经实现的那样。

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

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

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

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

【问题讨论】:

    标签: mysql cryptography md5 sha256 unique-key


    【解决方案1】:

    让我们看看您的要求:

    您需要确保值字段是唯一的。 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);
    

    与所有新事物一样,您应该尝试所有方法并找到最适合您的情况的方法。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 2015-04-16
      • 1970-01-01
      • 2011-06-29
      • 2012-03-20
      • 2018-12-07
      • 2018-04-21
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多