Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中强制字符集生成SHA-256_Php_Hash_Encoding_Character Encoding_Sha256 - Fatal编程技术网

在PHP中强制字符集生成SHA-256

在PHP中强制字符集生成SHA-256,php,hash,encoding,character-encoding,sha256,Php,Hash,Encoding,Character Encoding,Sha256,我试图在PHP中使用ISO-8859-1编码生成SHA-256十六进制,但没有找到方法 下面是我试图完成的“测试用例”(硬编码): function getHash($str) { return hash('sha256', $str); } $str1 = "Luiz"; $result1 = getHash($str1); $expect1 = '0dd0029404cbe8bbad2cd84ec0f5089e4ca29d46719323b15595ffa765a88ffe'; $

我试图在PHP中使用ISO-8859-1编码生成SHA-256十六进制,但没有找到方法

下面是我试图完成的“测试用例”(硬编码):

function getHash($str) {
    return hash('sha256', $str);
}

$str1 = "Luiz";
$result1 = getHash($str1);
$expect1 = '0dd0029404cbe8bbad2cd84ec0f5089e4ca29d46719323b15595ffa765a88ffe';
$success1 = $result1 == $expect1 ? 'true' : 'false';

$str2 = "Luíz";
$result2 = getHash($str2);
$expect2 = '7e957af88c30f35d2fa32d6dd1c9931d3bb8a52b798277bfcbe06736f03d6828';
$success2 = $result2 == $expect2 ? 'true' : 'false';

echo "Test 1: ".$str1."<br/>";
echo "Result should be: ".$expect1."<br/>";
echo "Result is: ".$result1."<br/>";
echo "Success? ".$success1;

echo "<br/><br/><br/>";

echo "Test 2: ".$str2."<br/>";
echo "Result should be: ".$expect2."<br/>";
echo "Result is: ".$result2."<br/>";
echo "Success? ".$success2;
正如您在上面的示例中所看到的,Java版本强制散列在ISO-8859-1中。 我相信PHP实现只适用于UTF-8,但我不确定。
有什么办法吗?

那不是哈什的错。它获取您传递给它的字符串中的确切字节序列,并对其进行散列。如果返回的是不同的散列值,那么文件的源代码会被破坏,因此
I
会被视为其他内容。是的,我就是这么想的。但是我如何强制PHP以预期的方式查看字符呢?即使我在字符串中强制编码(在哈希生成之前,使用
mb\u convert\u encoding
),它也不起作用。在Java示例中(其工作原理与预期类似),它在生成哈希之前将字节数组转换为正确的编码。我该怎么做呢?这更多地取决于在插入角色时编辑器对文件所做的操作。可以尝试
html\u实体\u解码('Luí;z','UTF-8')
或其他方法。我尝试了
utf8\u解码
,成功了!不知道为什么
mb\u convert\u编码
没有,心想。不管怎样,问题解决了。谢谢你的帮助;D
public class TokenGenerator {
    private static String getSha256Hash(final String x) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(x.getBytes("ISO-8859-1"));
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < hash.length; i++) {
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        String str = "EXAMPLE_STRING";
        System.out.println(getSha256Hash(str));
    }
}