按字符串搜索 PHP MySQL 表 - 使用散列?

标签 php mysql string hash integer

使用 PHP,我有一个带有 Actions 表的 MySQL 数据库,用户可以在其中选择性地将操作分配给他们网站中的某些页面。每个此类分配都会产生一个操作行,其中包含(除其他外)唯一的 ActionId 和相应页面的 URL。

稍后,当在特定页面的上下文中时,我想查明是否有分配给该页面的操作,并获取 (SELECT) 适当的操作行。那时我知道我的页面的 URL,所以我可以通过这个相对较长的字符串搜索 Actions 表。我怀疑这不是在数据库中搜索的最佳方式。

我假设更好的方法是使用某种哈希将我的长 URL 字符串转换为整数,确保没有两个不同的 URL 被转换为相同的整数(加密不是这里的问题)。有这样的PHP函数吗?或者,是否有更好的策略?

注意我已经看到了这个:SQL performance searching for long strings - 但它似乎并没有真正提出一个可靠的解决方案,除了提到 md5(它散列成一个字符串,而不是整数)。

最佳答案

散列策略是一个很好的策略。

处理 URL 字符串可能确实是个问题,因为它们可能很长,并且包含很多特殊字符,这对于 MySQL 搜索(REGEXPLIKE )。

这就是哈希解决问题的原因。即使 md5 不是用于散列密码的良好散列函数(因为它不再安全),也适用于散列 URL。

通过这种方式,您会将 http://www.stackoverflow.com 更改为 4c9cbeb4f23fe03e0c2222f8c4d8c065,这将非常独特(除非您非常不幸) .

设置完 md5_url 字段后,您可以使用以下方式进行搜索:

SELECT * FROM Actions where md5_url=?

? 是当前 URL 的 md5($url)

当然一定要在你的md5_url字段上设置一个索引:

ALTER TABLE Actions
ADD md5_url varchar(32),
ADD KEY(md5_url);

关于按字符串搜索 PHP MySQL 表 - 使用散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681332/

相关文章:

php - 无法选择数据库 php pdo mysql 上的第一行

mysql - 无需密码启动 MySQL

c# - 如何为可能为 null 的对象执行 ToString?

c++ - 创建随机二进制字符串 : how to remove null character '\0' from to_string() before inserting to another string

mysql - 跨 2 个表进行分组和计数

javascript - 替换 typescript 中字符串中的所有字符实例?

php - 无法在 jquery 和 jtable 中使用 datepicker 进行更新和创建

php - 改进比较网站的表结构设置

javascript - 如何在给定格式的 HTML 列表中显示 jQuery 数据值?

mysql - 在同一查询中使用 order by 和 group by 的 SQL