如何反转此自定义哈希

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))