使用 UTF-8 字符更正 SHA256 实现

Mar*_*cus 2 hash utf-8 sha character-encoding

我遇到了比较不同语言/函数生成的 SHA256 哈希的问题。

例如,SHA256("í")要么返回:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84
Run Code Online (Sandbox Code Playgroud)

-或者-

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5
Run Code Online (Sandbox Code Playgroud)

对于一个字符的字符串,上述哪个哈希是正确的,处理 UTF-8 字符串的正确方法是什么?

dec*_*eze 5

对于一个字符的字符串,上面哪个哈希是正确的

没有“正确”的答案。散列的是字节,而不是“字符”。散列的字节完全取决于字符串的编码。

"í"在 Windows-1252 中是 byte ED,其散列如下:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84
Run Code Online (Sandbox Code Playgroud)

"í"在 UTF-8 中是 bytes C3 AD,其散列为:

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5
Run Code Online (Sandbox Code Playgroud)

"í"在 UTF-16LE 中是 bytes ED 00,其散列如下:

430e2ca27910b5ee6e0ec56a12b81325c763376cb8e25a60362dce9444424f95
Run Code Online (Sandbox Code Playgroud)

它在各种编程语言中的工作方式取决于语言和它们用于字符串的编码。