MySQL:使用附加哈希字段的唯一文本字段

标签 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 字段的整个值定义唯一索引,但是有一张票(?)实现此类功能(请参阅 this page),建议使用散列创建唯一键,就像其他字段已经实现的一样。

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

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

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

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

最佳答案

让我们看看您的要求:

您需要确保值字段是唯一的。值字段是文本列,由于它的性质,无法在值字段上创建唯一索引(目前)。因此,使用一个额外的字段,即字段值的哈希值是您唯一真正的选择。

这种方法的优点:

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

这种方法的缺点:

  1. 在 INSERTS 和 UPDATES 期间要处理的额外字段,即有更多工作要做。
  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);

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

关于MySQL:使用附加哈希字段的唯一文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698884/

相关文章:

android - AWS/Android 无法计算 md5 哈希

php - 每分钟将选定的 MySQL 数据传输到另一台 MySQL 服务器的最佳方法是什么?

php - mysql中如何比较时间

测试密码学中已实现的算法

python - 尝试运行密码时出现错误 : "module ' hashlib' has no attribute 'scrypt' "

python - 将 (3) 个 32 字符的十六进制哈希组合成一个唯一的 32 字符的哈希?

c# - 对于支持 FIPS 的系统,是否有替代 MD5 的哈希算法?

mysql - 在 MySQL 中,如何将 BETWEEN 与 'AS' 列一起使用

mysql - 如何在 PHP 中将 MSSQL 日期转换为 MySQL 日期

ssl - 如何更改本地主机 (XAMPP) 上 TLS 协议(protocol)的密码学方法?