我使用此功能来散列我的密码:
// RETURNS: rAyZOnlNBxO2WA53z2rAtFlhdS+M7kec9hskSCpeL6j+WwcuUvfFbpFJUtHvv7ji
base64_encode(hash_hmac('sha384', $str . SC_NONCE, SC_SITEKEY, true));
我在 char(64)字段(MySQL -InnoDB)中存储哈希值。
我应该使用 varchar(64)而不是 char(64)吗?为什么呢?
修改 我用 sha384 更改了 sha256 。因为在这个例子中,sha256总是为我返回44个字节。抱歉令人困惑。现在它是64字节。
答案 0 :(得分:5)
varchars仅使用最多所需的长度来节省存储空间。如果64位散列总是64位,那么它在存储方面没有区别,所以在这种情况下char可能和varchar一样好。
如果要存储可变长度数据,那么varchar将节省浪费不必要的空间。
答案 1 :(得分:5)
您应该使用CHAR(64),因为哈希的长度是固定的。使用VARCHAR将添加另一个字节,浪费空间。
答案 2 :(得分:3)
你可以做的另一种方法(如果你真的非常关心空间)是以二进制形式存储哈希。可以找到有关如何执行此操作的一些详细信息here;你可能想要BINARY(32)用于SHA-256哈希。
答案 3 :(得分:2)
即使您使用Base 64编码的字符串,结果的长度也不一定是64位。在这种情况下,VARCHAR
更好,因为结果可能短于64位。
事实上,如here所示,64位是最大长度而不是设定长度。