散列密码的字符最少排序*必要*

时间:2018-11-05 22:15:11

标签: php mysql mariadb collation

我试图找出应该用于仅包含两列useremail的简单password表的排序规则,由此password的输入将是password_hash($str, PASSWORD_DEFAULT)的输出。

password_hash所需的最轻量级归类是什么?是ascii_bin吗? latin1_bin

1 个答案:

答案 0 :(得分:3)

整理性能...

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

与此同时,MySQL 8.0使utf8mb4_...排序规则比5.7“数量级更快”。

但是我通常发现其他注意事项在MySQL的任何操作中都更为重要。

该示例的另一示例... SELECT ... function(foo) ...-相对于获取行的成本,评估函数的成本通常并不重要。因此,我专注于如何优化提取行。

对于散列,...取决于函数是否返回十六进制字符串或一堆字节...

  • 十六进制:使用CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci) ...ci可以进行大小写折叠,因此更宽容;这可能是案件的“正确”整理方式。
  • 字节:使用数据类型BINARY;大致相当于CHAR CHARACTER SET binary

关于是否使用BINARYVARBINARY还是CHARVARCHAR,应该由函数是否返回固定长度的结果来控制。例如:

MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a'恰好返回32个十六进制字节,因此CHAR(32) COLLATION ascii_ci是'best'。

但是,您可以使用BINARY(16)(不使用排序规则)来节省空间,并将UNHEX(MD5('asdfb'))放入其中。

UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce',其中一些破折号可以消除。否则为CHAR(36)BINARY(16)