【问题标题】:Hash decryption, what algorithm can I use哈希解密,我可以使用什么算法
【发布时间】:2015-02-15 14:21:09
【问题描述】:

我已经写了哈希计算函数:

var hash = function (string) {
  var h = 7;
  var i = 0;
  var letters = "acdegilmnoprstuw";

  while (i < string.length) {
    h = (h * 37 + letters.indexOf( string[i++] ));
  }

  return h;
};

其中string = "agdpeew" 和结果是664804774844。但现在我不知道如何破译哈希。所以,如果我的输入是664804774844,答案将是agdpeew

我可以使用什么算法?

也许我可以从664804774844 / 37 开始,但我怎样才能获得字母索引?

【问题讨论】:

  • 使用“模”运算符,通常表示为 %,得到余数模 37。这应该给你一个 0..36 范围内的数字(实际上,小于那个),你然后可以使用它来索引数组letters
  • 一般,不可能将哈希码转换回创建它的值,因为可能的字符串比哈希码多。 通常,当有人试图反转哈希码时,他会尝试使用生成的哈希作为唯一键,这是一个非常糟糕的主意。您尝试反转此哈希码的目的是什么?
  • @JimMischel 作业
  • @JonathanLeffler 非常感谢,它的工作!

标签: algorithm encryption


【解决方案1】:

对于短字符串,您可以从以 37 为基数表示数字开始 - 但您为什么要这样做?散列函数的大多数用例不需要您反转函数,并且许多散列函数被设计为很难或不可能反转函数,除非通过在输入后评估输入,直到找到一个产生您正在寻找的哈希值。

【讨论】:

    【解决方案2】:

    下面是用 Swift 语言编写的代码,它对哈希值进行了加密和解密

    var letters = "acdegilmnoprstuw";
    

    散列/加密

    func hash(s:String) -> Int{
        var h = 7 as Int;
        for (var i = 0; i < s.characters.count; i++) {
            // Getting the character at index 
            let s2: Character = s[s.startIndex.advancedBy(i)]; 
            // Getting index of string 'acdegilmnoprstuw'
            let l : Int = letters.startIndex.distanceTo(letters.characters.indexOf(s2)!);  
            h = (h * 37 + l);
        }
        return h;
    }
    

    去散列/解密

    func unhash(hashValue:Int) -> String{
        var h = hashValue
        var unhashedString : String = ""
    
        while(h > 37){
            unhashedString.append(letters[letters.startIndex.advancedBy(h % 37)])
            h = h / 37
        }
        return String(unhashedString.characters.reverse())
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 2012-08-19
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多