mysql - 使用 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 字符哈希值?
解决方案
推荐阅读
- c++ - 如果未输入 getline 分隔符,推荐一种引发异常的方法?
- python-3.x - 如何运行具有包含换行符的参数的进程?
- java - 我想在什么时候输入一个可选的“错误号码。再试一次”
- java - 如何打印出具有缩进的代码以实际具有缩进?
- django - Django 模型数据过滤器
- python-3.x - xgboost plot_tree(model) - 修复 TypeError: super(type, obj) when Running
- wpf - 是否可以通过 ControlTemplate 中的 xaml 绑定 PolyLineSegment.Points?
- ios - 输入 UITextField 后 UIView 消失?
- python - 仅当重复且不是单词的一部分时才将字符替换为另一个字符
- r - Readme.Rmd 导致从 Rstudio 推送到 github 失败