【发布时间】:2019-08-23 05:51:38
【问题描述】:
我正在研究一个实现,我应该将长哈希 String 来回转换为 BigInteger(该函数应该是可逆的),但我不知道如何使它在 Java 中使用那些类。
我的第一个想法是做如下事情:
given s:String
for every character in the input string:
convert char to decimal ASCII representation (i.e. 'a' -> '97')
append result to s
build a BigDecimal with the resulting s
但问题是(正如许多用户所评论的那样)转换的长度,因为 ASCII 字符从 0 变为 255。它可以从 'a' -> '97' 更改为 'a' -> '097',但再次存在解码问题,删除每个字符的标题零(顺便说一句,算法效率较低)
因此,总而言之,这里提出的算法不是最好的主意,所以我对其他一些解决方案持开放态度。此外,如果String 和/或BigInteger 中有任何库或内置方法,它也很有帮助。签名是
public class EncodeUtil {
public BigInteger encode(String s) {...}
public String decode(BigInteger bi) {...}
}
条件是decode(encode("som3_We1rd/5+ring"))输出"som3_We1rd/5+ring"
我认为值得一提的是,接收到的用于解码的字符串是像 lQ5jkXWRkrbPlPlsRDUPcY6bwOD8Sm/tvJAVhYlLS3WwE5rGXv/rFRzyhn4XpUovwkLj2C3zS1JPTQ1FLPtxNXc2QLxfRcH1ZRi0RKJu1lK8TUCb6wm3cDw3VRXd21WRsnYKg6q9ytR+iFQykz6MWVs5UGM5NPsCw5KUBq/g3Bg= 这样的哈希值
欢迎任何想法/建议。提前感谢您的宝贵时间。
【问题讨论】:
-
当你必须追加这么多次时,你应该使用 StringBuilder。
-
@ghoul932 可以肯定的是,我只是在尽可能抽象地编写算法,即使我们知道我们使用的是 Java
-
hash("abz") -> 9798122 将失败。你怎么知道在哪里分隔/分割整数?您不能使用两位数('z' -> 122)。
-
'可逆哈希'在术语上是矛盾的。你在这里做的是编码和解码。
-
q中提到的算法。仅在严格不使用某些字符(如 ASCII 值 1、10、11、12)时才有效。