gpt4 book ai didi

java - 如何在限制字符集下将字节数组转换为字符串?

转载 作者:行者123 更新时间:2023-12-01 22:19:51 24 4
gpt4 key购买 nike

我想对 IP 号码应用加密哈希,并让哈希采用字符集“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_”。

到目前为止我的尝试:

    String ipWithSecret = secret + "123.123.123.123";
byte[] ipBytes = ipWithSecret.getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] mdBytes = md.digest(ipBytes);
System.out.println("MD5: " + mdBytes);
System.out.println("US ASCII: " + new String(mdBytes, StandardCharsets.US_ASCII));
System.out.println("Hex: " + HexBin.encode(mdBytes));
System.out.println("Base64: " + Base64.encodeBase64String(mdBytes));
System.out.print("Binary: ");
for (byte b : mdBytes) {
System.out.print(Integer.toBinaryString(b & 255 | 256).substring(1));
}

输出:

MD5:      [B@6d6f6e28
US ASCII: :???RN???z?}k^?
Hex: 3A8BB1881E524EDFEFE67AFF7D6B5E9D
Base64: OouxiB5STt/v5nr/fWtenQ==
Binary: 00111010100010111011000110001000000111100101001001001110110111111110111111100110011110101111111101111101011010110101111010011101

除了十六进制之外,没有什么是可以接受的。我的可用字母表比十六进制字母表大得多,并且因为我必须处理 16 个字符的长度限制,所以我希望哈希字符串更短。

有什么建议我可以实现这一目标吗?

回答我稍微修改了约翰的答案,所以功劳归于他。这是我的代码,它也可以在一定程度上处理冲突:

    String secret = "secret";  //config file, do not store in code
Set existingMdBase64Alt = new HashSet(Arrays.asList("OouxiB5STt_v5nr_", "ouxiB5STt_v5nr_f"));
String ipWithSecret = secret + "123.123.123.123";
byte[] ipBytes = ipWithSecret.getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] mdBytes = md.digest(ipBytes);
String mdBase64 = Base64.encodeBase64String(mdBytes);
String mdBase64Alt = mdBase64.replace("+","_").replace("/","_" );
System.out.println("Debug: " + mdBase64Alt.substring(0, 16));
while (mdBase64Alt.length() > 16 && existingMdBase64Alt.contains(mdBase64Alt.substring(0, 16))){
mdBase64Alt = mdBase64Alt.substring(1);
System.out.println("Debug: " + mdBase64Alt.substring(0, 16));
}
System.out.println("Final: " + mdBase64Alt.substring(0, 16));

最佳答案

一般来说,不要重新发明轮子:使用base64 。这是一般的“比十六进制短,但仍然可打印的 ASCII”解决方案。有各种可用的 base64 选项,具体取决于您使用的 Java 版本等。如果您使用的核心框架中没有任何内容,我喜欢 iharder.net public domain implementation .

但是,这并不能真正对您有帮助。 MD5 哈希值是 16 个字节 - 因此,除非您有 256 个字符可供使用(用单个字符表示每个字节),否则您最终将得到超过 16 个字符,这只是因为您的信息量我正在尝试代表。

正如评论中所指出的,IPv4 地址只有 4 个字节。坦率地说,散列不会使它变得非常模糊,因为对整个地址空间进行散列是非常可行的......

关于java - 如何在限制字符集下将字节数组转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30093167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com