首页 > 解决方案 > 使用 MySQL-only 解决方案混淆 MySQL 表的 ID 并生成 UNIQUE 值

问题描述

我需要使用仅 MySQL 的解决方案(没有像 PHP 这样的应用程序代码)来混淆 MySQL 表的 ID,并生成 UNIQUE 值。

这是我设法开始工作的内容(使用 MySQL 触发器更新使用 comment_hash 值插入的行。问题是我收到“重复条目”错误。我知道哈希不是唯一的,但我如何映射一个 UNIQUE _comments.id 值为唯一的 4 字符哈希?)

DROP TABLE IF EXISTS _comments;
CREATE TABLE IF NOT EXISTS _comments (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `comment_hash` VARCHAR(255) NOT NULL,
    `user_id` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `comment_user_hash_parentid_unique` (`user_id`,`comment_hash`)
)  ENGINE=INNODB;


DROP TRIGGER IF EXISTS `test_add_comment_hash_on_insert_into_comments_table`;
DELIMITER //
CREATE TRIGGER test_add_comment_hash_on_insert_into_comments_table
BEFORE INSERT ON _comments
FOR EACH ROW
BEGIN
    SET NEW.comment_hash = right(md5(LAST_INSERT_ID()+1),4);
END
//
DELIMITER ;

然后在我的播种器中(我使用 Laravel 是为了方便在 PHP for 循环中进行多次插入),但您可以使用任何东西进行快速插入。


<?php

use Illuminate\Database\Seeder;

use Faker\Generator as Faker;

// Call using command: php artisan db:seed --class=CommentsFakeDataSeeder
class WtfFakeDataSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run(Faker $faker)
    {
        echo "Seeding _comments... \n";

        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $fake_comments = [];

        for ($i = 0; $i < 10000; $i++) {
            $fake_comments[] = [
                'user_id'   => 1,
            ];
        }
        DB::table('_comments')->insert($fake_comments);

        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
}

我调用播种机: php artisan db:seed --class=WtfFakeDataSeeder

但我总是以违反完整性约束而告终

Doctrine\DBAL\Driver\PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-849b' for key 'comment_user_hash_parentid_unique'")

在 4 个字符的 comment_hash 中允许使用仅小写字母数字字符,我们应该有 36^4 = 1679616 个值。然而,正如您在下面看到的那样,插入 < 10K 时会发生冲突。md5() 在这里不是正确的解决方案..你知道吗?id 总是唯一的......无论我是否将它们与 userID 结合(以引入更多熵),我如何将它们映射到唯一的 4 字符哈希值?

标签: mysqldatabasehashhashmap

解决方案


推荐阅读