如何在不使用文本字段的情况下在MySQL数据库中存储哈希值

Wil*_*iam 2 php mysql hash md5

我在MySQL MyISAM表中存储了唯一的用户代理,所以当我必须查看它是否存在于表中时,我会检查存储在TEXT字段旁边的md5哈希.

User-Agents 
{
    id         - INT
    user-agent - TEXT
    hash       - VARCHAR(32) // md5
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做同样的但使用32位整数而不是文本哈希?也许原始格式的md5会更快?这将需要二元搜索.

[编辑]

MySQL不处理完整区分大小写的字符串的哈希搜索?

小智 7

存放UNHEX(MD5($value))在一个BINARY(16).


Mat*_*hew 5

你可以这样做:

User-Agents 
{
    id         - INT
    user-agent - TEXT
    hash       - UNSIGNED INT (CRC32, indexed)
}


$crc32 = sprintf("%u", crc32($user_agent));

SELECT * FROM user_agents WHERE hash=$crc32 AND user_agent='$user_agent';
Run Code Online (Sandbox Code Playgroud)

对于这种数据,你不太可能与crc32发生冲突.

要确保冲突不会导致问题,请添加辅助搜索参数.MySQL将能够使用索引快速查找记录.然后它可以进行简单的字符串搜索,以保证匹配正确.

PS:sprintf()用于处理带符号的32位整数.在64位系统上应该是不必要的.