首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何反转此自定义散列

如何反转此自定义散列
EN

Stack Overflow用户
提问于 2021-07-18 10:14:18
回答 1查看 116关注 0票数 0

所以我在JS中有了这个散列算法,我想知道如何才能反转它产生的散列?我知道人们经常问这些问题,但这种散列算法是独一无二的(我认为)。这就是它:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-18 14:31:20

对于已知非常短的消息(例如,4个大写ASCII字符或更少),您的哈希很容易可逆

如果您的消息仅为大写或小写,则字符仅在32位块内不同,即2^5。因此,当您将数字移位5位位置时,下一个传入字符不会重叠。

因此,您可以从最高位开始,读取第一个字符,然后考虑该字符将如何通过各种步骤(移位和减法)进化。这将允许您“撤消”第一个字符的效果。

现在,您已经删除了第一个字符,剩下的散列更简单了,它是消息中剩余字符的散列。然后,您可以重复该操作,直到完成所有字符。

如果消息更长,特别是如果它允许包含更多的符号,那么您的任务就会困难得多。

如果这能帮助你入门,请告诉我:

代码语言:javascript
复制
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))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68425505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档