如何反转此自定义哈希
How to reverse this custom hash
所以我在 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
对于已知非常短的消息(例如 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))
所以我在 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
对于已知非常短的消息(例如 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))