所以我在JS中有了这个散列算法,我想知道如何才能反转它产生的散列?我知道人们经常问这些问题,但这种散列算法是独一无二的(我认为)。这就是它:
const stringToHash = string => {
var hash = 0;
if (string.length == 0) return hash;
for (i = 0; i < string.length; i++) {
char = string.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash;
}
return hash;
}下面是它给我的输出示例:-566853151
发布于 2021-07-18 14:31:20
对于已知非常短的消息(例如,4个大写ASCII字符或更少),您的哈希很容易可逆
如果您的消息仅为大写或小写,则字符仅在32位块内不同,即2^5。因此,当您将数字移位5位位置时,下一个传入字符不会重叠。
因此,您可以从最高位开始,读取第一个字符,然后考虑该字符将如何通过各种步骤(移位和减法)进化。这将允许您“撤消”第一个字符的效果。
现在,您已经删除了第一个字符,剩下的散列更简单了,它是消息中剩余字符的散列。然后,您可以重复该操作,直到完成所有字符。
如果消息更长,特别是如果它允许包含更多的符号,那么您的任务就会困难得多。
如果这能帮助你入门,请告诉我:
const stringToHash = string => {
var hash = 0;
if (string.length == 0) return hash;
for (i = 0; i < string.length; i++) {
char = string.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash;
}
return hash;
}
console.log(stringToHash("A").toString(2))
console.log(stringToHash("AA").toString(2))
console.log(stringToHash("AAA").toString(2))
console.log(stringToHash("B").toString(2))
console.log(stringToHash("BA").toString(2))
console.log(stringToHash("BAA").toString(2))
https://stackoverflow.com/questions/68425505
复制相似问题