为了简单起见,我只想回显sha512的前40个字符
$salt = "fRY^YXCH%^ER^*&^";
$profiletoken = hash("sha512", $salt . $user . $id . $value);
echo $profiletoken;
所以这会产生类似这样的输出
09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568
但我只想要前40个字符
09821f0ae9bdee372b344b0921582f2e7a3a0587
谢谢,希望我能自我澄清
$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:对于任何想阅读更多关于截断哈希主题的人,我在Cryptography Exchange上询问了这个问题,从那以后,它就成了一个非常流行的问题:
将SHA512哈希截断为前160位是否与使用SHA1一样安全?
substr就是您所需要的全部。
echo substr($profiletoken, 0 ,40);
如果您只是使用它来生成一个唯一的令牌来跟踪游戏状态,您可能希望使用uniqid,或者如果您将状态保存到文件系统tempnam
如果您没有足够的空间来输出sha512,请使用较小的哈希:
sha1($profileToken);
对sha512的输出执行substr()
会降低其有效性,并且在这个过程中只会浪费CPU周期。