我需要从包含用户密码的字符串创建哈希。为了创建哈希,我使用通过调用获得的字节数组String.getBytes()
。但是,当我在不是默认编码的平台上使用指定编码(例如 UTF-8)调用此方法时,非 ASCII 字符会被默认字符替换(如果我正确理解 getBytes() 的行为) )因此在这样的平台上,我将得到一个不同的字节数组,并最终得到一个不同的哈希值。
由于字符串内部存储为 UTF-16,因此将调用String.getBytes("UTF-16")
保证我在每个平台上都能得到相同的字节数组,无论其默认编码如何?
是的。不仅保证它是 UTF-16,而且字节顺序也被定义:
解码时,UTF-16 字符集解释输入流开头的字节顺序标记来指示流的字节顺序,但如果没有字节顺序标记,则默认为 big-endian;编码时采用big-endian字节顺序,并写入big-endian字节顺序标记。
(当调用者没有要求时,BOM 不相关,因此String.getBytes(...)
不会包括它。)
只要你有相同的字符串内容 - 即相同的序列char
值 - 那么你将在 Java 的每个实现上获得相同的字节,除非出现错误。 (考虑到 UTF-16 可能是 Java 中实现的最简单的编码,任何此类错误都会非常令人惊讶......)
事实上 UTF-16 是char
(并且通常对于String
然而,仅在易于实施方面相关。例如,我会also expect String.getBytes("UTF-8")
在每个平台上给出相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)