具有最少字符数的排序规则*对于散列密码是必需的*

Collation with Least Amount of Characters *Necessary* for Hashed Passwords

我正在尝试找出应该用于仅包含两列 emailpassword 的简单 user 表的排序规则,其中 [=12] 的输入=] 将是 password_hash($str, PASSWORD_DEFAULT).

的输出

password_hash 所需的最轻量级排序规则是什么?是ascii_bin吗? latin1_bin?

整理性能...

..._bin要做的事情最少,所以他们最快。
ascii_... 检查您是否只使用了 7 位;这么快。
..._general_ci 只检查字节,不检查字节组合。示例:德语 ß <> 'ss',与大多数其他归类不同。
utf8_...utf8mb4_... 检查有效编码的字节。

同时,MySQL 8.0 使 utf8mb4_... 归类 "orders of magnitude faster" 比 5.7 更甚。

但我通常发现其他考虑因素在MySQL的任何操作中都更为重要。

另一个例子... SELECT ... function(foo) ... -- 评估函数的成本相对于获取行的成本通常是微不足道的。因此,我专注于如何优化获取行。

至于哈希,...这取决于函数returns是十六进制字符串还是一堆字节...

  • Hex:使用CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci)...ci会进行大小写折叠,从而更加宽容;这可能是案例的 'right' 排序规则。
  • 字节:使用数据类型BINARY;大致相当于 CHAR CHARACTER SET binary.

至于是用BINARY还是VARBINARY还是CHAR还是VARCHAR,要看函数returns是否定长了结果。例如:

MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a' returns 正好是 32 个十六进制字节,所以 CHAR(32) COLLATION ascii_ci 是 'best'.

但是,您可以使用 BINARY(16)(无整理)保存 space,然后将 UNHEX(MD5('asdfb')) 放入其中。

UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce',其中有一些破折号需要去掉。否则为 CHAR(36)BINARY(16).