我需要根据 Java 中的一些输入数据(如客户电子邮件地址)生成 30 个字符的固定长度哈希。经过一番搜索,我发现了 SHA-3 海绵函数,我可以在其中指定所需的长度。我使用 Bouncy CastleSHAKEDigest
类实现了以下内容。
public class App {
public static void main(String[] args) {
final String message = "Hello World!";
System.out.println(getHash(message, 64));
System.out.println(getHash(message, 30));
System.out.println(getHash(message, 20));
}
static String getHash(final String message, final int lengthInCharacters) {
final byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
final SHAKEDigest digest = new SHAKEDigest(128);
final byte[] hashBytes = new byte[lengthInCharacters / 2];
digest.update(messageBytes, 0, messageBytes.length);
digest.doOutput(hashBytes, 0, hashBytes.length);
return Hex.toHexString(hashBytes);
}
}
如果我执行它,我会得到以下输出:
aacfe6ebd3737d9f195c837c5281d3f87646ecd7e43864e1a40456e40f264046
aacfe6ebd3737d9f195c837c5281d3
aacfe6ebd3737d9f195c
我希望散列完全不同,具体取决于请求的长度。现在看起来,我还可以使用 JDK 生成一个简单的 SHA-256 哈希MessageDigest
,然后将其截断为所需的长度。
我做错了什么还是我误解了这些海绵功能的意义?
带有单元测试的完整代码可在以下位置获得:https ://github.com/steinsag/java-dynamic-hash