1,157
edits
(→Hash algorithm: replace the code snippet with the sead implementation and add more information about the s8 cast) |
m (→Hash algorithm) |
||
(One intermediate revision by the same user not shown) | |||
Line 5: | Line 5: | ||
=== Hash algorithm === | === Hash algorithm === | ||
Nintendo's algorithm uses an unsigned 32-bit integer for the hash variable | Nintendo's algorithm uses an unsigned 32-bit integer for the hash variable. Also note that Nintendo iterates over each byte, not each string character. | ||
Here is an accurate implementation of the algorithm, written in C++: | Here is an accurate implementation of the algorithm, written in C++: | ||
Line 27: | Line 27: | ||
Note that in older versions of sead, characters were not explicitly casted to <code>s8</code> so the end result would depend on the signedness of <code>char</code> (which is implementation-defined). For GHS compiled code on the Wii U, <code>char</code> is unsigned whereas it's signed with Clang (AArch64 target). PC tools most likely use a signed <code>char</code> as that is the default signedness for x86 targets. | Note that in older versions of sead, characters were not explicitly casted to <code>s8</code> so the end result would depend on the signedness of <code>char</code> (which is implementation-defined). For GHS compiled code on the Wii U, <code>char</code> is unsigned whereas it's signed with Clang (AArch64 target). PC tools most likely use a signed <code>char</code> as that is the default signedness for x86 targets. | ||
In newer versions of sead, an explicit cast to <code>signed char</code>, aka <code>std::int8_t</code>, aka <code>s8</code>, to ensure hashes are the same regardless of the target platform. Without the cast, non-ASCII characters (e.g. Japanese UTF-8 bytes) would result in hashes being different across platforms. | In newer versions of sead, an explicit cast to <code>signed char</code>, aka <code>std::int8_t</code>, aka <code>s8</code>, was added to ensure hashes are the same regardless of the target platform. Without the cast, non-ASCII characters (e.g. Japanese UTF-8 bytes) would result in hashes being different across platforms. | ||
== Usage in ''Breath of the Wild'' == | == Usage in ''Breath of the Wild'' == |