デバイス識別子をハッシュする方法を探し回ったところ、次のコードに出くわしました。
私はそれが何をしているのか本当に理解していません。
- デバイス ID を urlEncode する必要があるのはなぜですか?
- バイトをハッシュする必要があるのはなぜですか? String でそれを行うことはできませんか?
- なぜ BigInteger に変換する必要があるのですか?
- ハッシュされた id を持つ文字列を取得するためにビットをシフトする必要があるのはなぜですか?
行ごとに何が起こっているのか説明できる人はいますか? これが、ブログやフォーラムでも流布されているこのスニペットを他の人が理解するのに役立つことを願っています。
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;