我试图找到一种获得字符串的base10值的方法。这在哈希代码函数中很容易实现,如下图所示。但我注意到这些值是连续的或接近它的。下面的例子。
在这里,我不是在处理安全密码或其他任何事情,我只是希望能够将字符串转换为base10值,并且在执行此操作时始终获得相同的值。
可能有点过火,但看看现有的哈希选项,如MessageDigest。但它们都是Base64 (或多或少),但对于Base10则没有,考虑到这一点并不安全,这一点是预料中的。
我认为一个可能的选择是使用MessageDigest,获取一个base64值并对其进行正则化,只提取所有的数字。这意味着每次我通过消息摘要和regex编码只获得Base10值时,我都应该得到相同的值。
我的问题是,有没有更好的方法来做到这一点?而不是用加密来使它复杂化,这在我的情况下并不是真正需要的。
我只想按以下方式转换示例:
String s1 = "Sample00000000001";
// after encoding, getting Base10 value like -> 8725342728354
String s2 = "Sample00000000002";
// after encoding, getting Base10 value like -> 11576232138652 (random, not sequential even though only 1 character changed). 尝试使用来自Java的Base64,这会按顺序(或关闭)产生结果,因此不是我想要的结果。仍然需要从这里重新计算出Base10值。
public static void main(String[] args) {
String salt = "Sample";
String num = "00000000001";
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
String value = salt + num;
String encoded = encoder.encodeToString(value.getBytes());
String decoded = new String(decoder.decode(encoded));
// 00000000001 gives U2FtcGxlMDAwMDAwMDAwMDE=
// 00000000002 gives U2FtcGxlMDAwMDAwMDAwMDI=
}使用hashcode,这再次结束顺序或关闭。
public static void main(String[] args) {
String salt = "Sample";
String num = "00000000002";
String v = salt+num;
int hash = v.hashCode();
System.out.println(hash);
}最后一个选项,我正在使用库,如弹跳城堡或在构建的MessageDigest。
假设编码已经完成,我已经将其分配给下面的变量“value”。我只能通过regex提取Base10值,如下所示。
String value = "HASDJHSDGF3423HIHGH234565BJB666";
long result = Long.valueOf(value.replaceAll("\\D+",""));
System.out.println(result); // end up with 3423234565666 as expected. 目前,我倾向于使用MessageDigest的最后一个选项,但希望找到更好的方法来提供建议/选项。感谢你的帮助。谢谢。
发布于 2020-06-02 20:16:05
方法hashCode的目的是在HashMap等数据结构中搜索对象。标准实现是基于内存中的地址,而不是字符串的内容,因此对于您的情况来说,它是无用的。
Base64不是加密,也不是哈希函数。它只对二进制数据进行转换,以便将其存储为文本,因此输入中的小变化将使输出发生小的变化。
您需要的是使用一些真正的散列函数,如SHA,并将结果转换为您的格式。
https://stackoverflow.com/questions/62160392
复制相似问题