我正在研究一种实现,该实现应该将长哈希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=
欢迎任何想法/建议。预先感谢您的宝贵时间。
答案 0 :(得分:1)
这大致满足您的要求-但是,当每个“十进制ASCII表示”的位数是可变的时,您所要求的内容将无法使用。另外,您想要的不是hash function:
public class Driver {
public static void main(String[] args) {
String s = "Reversible Hash a String to BigInteger in Java";
System.out.println(HashUtil.notReallyHash(s));
System.out.println(HashUtil.notReallyUnhash(HashUtil.notReallyHash(s)));
}
}
class HashUtil {
private static final byte SENTINEL = (byte) 1;
public static BigInteger notReallyHash(String s) {
CharBuffer charBuf = CharBuffer.wrap(s.toCharArray());
ByteBuffer byteBuf = ByteBuffer.allocate(charBuf.length() * Character.BYTES + 1);
byteBuf.put(SENTINEL); // need this in case first byte is 0 - biginteger will drop it
byteBuf.asCharBuffer()
.append(charBuf);
return new BigInteger(1, byteBuf.array());
}
public static String notReallyUnhash(BigInteger bi) {
ByteBuffer byteBuf = ByteBuffer.wrap(bi.toByteArray());
byteBuf.get(); // SENTINEL
CharBuffer charBuf = byteBuf.asCharBuffer();
StringBuilder sb = new StringBuilder();
int count = charBuf.length();
for (int i = 0; i < count; i++) {
sb.append(charBuf.get());
}
return sb.toString();
}
}
收益:
361926078700757358567593716803587125664654843989863967556908753816306719264539871333731967310574715835858778584708939316915516582061621172700488541380894773554695375367299711405739159440282736685351257712598020862887985249
Reversible Hash a String to BigInteger in Java