【发布时间】:2012-11-08 16:54:45
【问题描述】:
我四处搜索如何对设备标识符进行哈希处理并偶然发现了以下代码。
我真的不明白它在做什么。
- 为什么需要对设备ID进行urlEncode?li>
- 为什么我需要对字节进行哈希处理,难道我不能只对字符串进行哈希处理吗?
- 为什么需要将其转换为 BigInteger?
- 为什么我需要移动位来获得带有散列 id 的字符串?
谁能逐行解释发生了什么?我希望这也能帮助其他人理解这个在博客和论坛中传播的 sn-p。
String hashedId = "";
String deviceId = urlEncode(Secure.getString(context.getContentResolver(), Secure.ANDROID_ID));
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte bytes[] = digest.digest(deviceId.getBytes());
BigInteger b = new BigInteger(1, bytes);
hashedId = String.format("%0" + (bytes.length << 1) + "x", b);
} catch (NoSuchAlgorithmException e) {
//ignored
}
return hashedId;
【问题讨论】:
-
您对所使用的散列技术有什么不了解的地方?
-
我不明白你为什么需要对 android id 进行 urlEncode。我不了解有关 MessageDigest 的部分。那是什么?我可以传递任何字符串吗?为什么不消化字符串?为什么它必须消化字符串字节?为什么我得到一个字节数组? BigInteger 部分是怎么回事?位移位?为什么需要这样做。
-
这是一个非常明确的问题,但我自己也无法回答,因为我不知道为什么每一行都这样写。我自己盲目地使用了这段代码 sn-p 并没有真正理解每一行的作用。
-
我不能理解的主要是位移和 String.format 的东西。我不明白为什么会这样。