編集:私は当初、「最速のハッシュアルゴリズム」とは何かという質問を読みましたが、「各アルゴリズムの最速の実装」であることが明確になりました。これは有効な質問であり、他の人はより高速な実装を指摘しています。ただし、大量のデータを短時間でハッシュしない限り、それほど重要ではありません。通常、標準の JCE で提供されているもの以外のものを使用するのに、時間と複雑さを費やす価値があるとは思えません。
URLアドレスの場合、最新のハードウェアで1秒あたり100万回以上のSHA-256でハッシュする必要があり、より高速なものが必要になります。ほとんどのアプリケーションが 1 秒あたり 1,000 を超える (1 日あたり 8,600 万を超える) 必要があるとは想像できません。つまり、ハッシュに費やされる全体の CPU 時間は 1% をはるかに下回ることになります。したがって、無限に高速なハッシュ アルゴリズムを使用したとしても、全体的なパフォーマンスを最大で 1% しか改善できません。
元の回答:最高と最速の両方を得ることは、互いに矛盾しています。より良いハッシュは一般的に遅くなります。本当に速度が必要で、セキュリティがそれほど重要でない場合は、MD5 を使用してください。最高のセキュリティが必要な場合は、SHA-256 または SHA-512 を使用してください。あなたはそれを何に使用しているかについて言及していないので、どちらかをお勧めするのは難しいです. とにかく、最新のハードウェアでのほとんどのユースケースで十分に高速であるため、SHA-256 を使用するのがおそらく最も安全です。方法は次のとおりです。
String input = "your string";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(input.getBytes("UTF-8"));
byte[] hash = digest.digest();
パスワードのハッシュ化など、セキュリティ目的でこれを使用している場合は、ダイジェストにもソルトを追加する必要があります。ハッシュから印刷可能な文字列が必要な場合は、それを 16 進数として文字列にエンコードできます。
static char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder(hash.length * 2);
for (byte b : hash) {
sb.append(HEX_CHARS[(b & 0xF0) >> 4]);
sb.append(HEX_CHARS[b & 0x0F]);
}
String hex = sb.toString();