为了简单起见我只想回显 sha512 的前40个字符
$salt = "fRY^YXCH%^ER^*&^";
$profiletoken = hash("sha512", $salt . $user . $id . $value);
echo $profiletoken;
所以这会产生类似输出
的内容09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568
但我只想要前40个字符
09821f0ae9bdee372b344b0921582f2e7a3a0587
谢谢,希望我清楚自己
答案 0 :(得分:3)
$profiletoken = hash("sha512", $salt . $user . $id . $value);
$shortToken = substr($profiletoken, 0, 40);
但我问你的问题是为什么你要把它缩短到40个字符?这种做法违背了使用SHA512的意义,SHA512产生128个字符。对于SHA512,您可以将其作为CHAR(128)存储在数据库中。
$profiletoken = hash("sha1", $salt . $user . $id . $value);
echo $profiletoken; // 40 characters long
编辑1:不要使用SHA1,它不安全。
编辑2:对于想要阅读有关截断哈希主题的更多信息的人,我在密码交换中询问了它,并且它已成为一个非常受欢迎的问题:
Is truncating a SHA512 hash to the first 160 bits as secure as using SHA1?
答案 1 :(得分:2)
substr就是你所需要的。
echo substr($profiletoken, 0 ,40);
如果你只是使用它来生成一个唯一的令牌来跟踪你可能想要使用uniqid查看的游戏状态,或者你是否将状态保存到文件系统tempnam
答案 2 :(得分:0)
如果没有足够的空间来输出sha512,请使用较小的哈希:
sha1($profileToken);
对sha512的输出执行substr()
会降低其效率,而您只是在此过程中浪费CPU周期。