哈希密码所需字符数最少的排序规则

tpxzln5u  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(281)

我在想我应该用什么样的排序规则来处理简单的问题 user 只包含两列的表, email 以及 password ,其中 password 将是 password_hash($str, PASSWORD_DEFAULT) .
密码散列所需的最轻加权排序规则是什么?它是 ascii_bin ? latin1_bin ?

okxuctiv

okxuctiv1#

排序规则性能。。。 ..._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 是“最好的”。
但是,您可以通过使用 BINARY(16) (无排序)并将 UNHEX(MD5('asdfb')) 我喜欢它。 UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce' ,它有一些破折号要处理。否则,就是这样 CHAR(36) 或者 BINARY(16) .

相关问题