从C#到Android/java的端口sha-1哈希
我需要从C移植以下代码# 到Android应用程序。我有一个Java版本:从C#到Android/java的端口sha-1哈希,java,c#,android,sha1,Java,C#,Android,Sha1,我需要从C移植以下代码# 到Android应用程序。我有一个Java版本: private static String hashCode(String userCode) { String hashSha1; MessageDigest digest = null; try { digest = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException e) {
private static String hashCode(String userCode) {
String hashSha1;
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
digest.reset();
byte[] data = digest.digest(userCode.getBytes());
return Base64.encodeToString(data, Base64.DEFAULT);
}
唉,这段代码不会产生相同的结果。找出原因是一场白费力气的追逐
在Android中我可以做些什么来获得相同的哈希值?这是将userCode
字符串转换为字节的C代码:
byte[] bytes = Encoding.Unicode.GetBytes(code);
Java代码只是:
userCode.getBytes()
这意味着在Java中,您使用的是平台默认编码,即Android上的UTF-8。您应该为指定等效的编码,即
您几乎不应该调用String(byte[])
或String.getBytes()
,两者都使用平台默认编码。始终指定要使用的编码
更一般地说,您说过“找出原因是一场白费力气的追逐”——但在这种情况下,解决方案几乎总是一次详细记录转换的一个步骤。这里有三个转换:
到字符串
(将字节[]
编码为二进制数据)用户代码
- MD5哈希(
到字节[]
)字节[]
- 将哈希编码为base64
userCode
字符串转换为字节的C代码:
byte[] bytes = Encoding.Unicode.GetBytes(code);
Java代码只是:
userCode.getBytes()
这意味着在Java中,您使用的是平台默认编码,即Android上的UTF-8。您应该为指定等效的编码,即
您几乎不应该调用String(byte[])
或String.getBytes()
,两者都使用平台默认编码。始终指定要使用的编码
更一般地说,您说过“找出原因是一场白费力气的追逐”——但在这种情况下,解决方案几乎总是一次详细记录转换的一个步骤。这里有三个转换:
到字符串
(将字节[]
编码为二进制数据)用户代码
- MD5哈希(
到字节[]
)字节[]
- 将哈希编码为base64
如果您单独执行了这些步骤,并记录了结果,您就会发现问题出在第一步。Android将UTF-8作为默认字符集。尝试改用。Android将UTF-8作为默认字符集。尝试改用。为什么需要再次生成哈希?嗯?如果您不想再次生成散列,散列的意义何在?我只需要移植这段代码。代码生成哈希。为什么需要再次生成哈希?嗯?如果您不想再次生成散列,散列的意义何在?我只需要移植这段代码。代码生成散列。最好将
UTF_16LE
指定为显式的endianness。最好将UTF_16LE
指定为显式的endianness。