Algorithm 散列解密

Algorithm 散列解密,algorithm,encryption,hash,Algorithm,Encryption,Hash,我有一个哈希解密函数。如果输入为66480477484,则输出为agdpeew。我使用模和除法来查找字母索引。但在while循环中,我写了I=7,因为我知道输出字符串(agdpeew)的大小。如何找到I 解密函数: var f = function (h) { var letters, result, i; i = 7; result = ""; letters = "acdegilmnoprstuw"; while (i) { Result += letters

我有一个哈希解密函数。如果输入为
66480477484
,则输出为
agdpeew
。我使用模和除法来查找字母索引。但在while循环中,我写了
I=7
,因为我知道输出字符串(
agdpeew
)的大小。如何找到
I

解密函数:

var f = function (h) {
  var letters, result, i;

  i = 7;
  result = "";
  letters = "acdegilmnoprstuw";

  while (i) {
    Result += letters [parseInt (h % 37)];
    h = h / 37;
    i--;
  }

  return result.split("").reverse().join("");
};
hash (s) {
    h = 7;
    letters = "acdegilmnoprstuw";
    for(i = 0; i < s.length; i++) {
        h = (h * 37 + letters.indexOf(s[i]));
    }
    return h;
}
加密函数:

var f = function (h) {
  var letters, result, i;

  i = 7;
  result = "";
  letters = "acdegilmnoprstuw";

  while (i) {
    Result += letters [parseInt (h % 37)];
    h = h / 37;
    i--;
  }

  return result.split("").reverse().join("");
};
hash (s) {
    h = 7;
    letters = "acdegilmnoprstuw";
    for(i = 0; i < s.length; i++) {
        h = (h * 37 + letters.indexOf(s[i]));
    }
    return h;
}
散列{
h=7;
letters=“acdegilmnopstuw”;
对于(i=0;i
这取决于您如何处理溢出。如果您的“加密”函数允许输入足够长的时间,以至于h在某个点溢出,那么您就被填充了,并且您当前的解密方法根本不起作用

如果您可以保证没有溢出,那么您的最终h将是(An)x^n形式的项之和,其中An是序列中的第n个字母,通过indexof方法转换为数字(在本例中x是37)

解密基本上采用x^0项(使用mod x),然后将其转换。然后它除以x(大概使用整数数学)以丢失旧的x^0项,并得到一个新的项进行解释

这意味着您实际上可以一直这样做,直到
h
为0,此时您知道您已经处理了所有字符

一个有趣的注意事项是x只需要大于
字母的长度
(因为a必须小于x)。在溢出之前,较小的X将提供更多可能的输入字符

如果您允许溢出,那么您没有办法做到这一点,除非您知道输入有多长时间。即便如此,这也可能很棘手。如果您的输入长度不受限制,那么您可以有1000个字符的输入,所有这些组合都有很多可能的h值。虽然事实上没有。仍然有2^32个可能的结果(事实上,在您的算法中更少),如果您有超过2^32个可能的输入,那么您就不可能有可逆函数,因为您必须至少有2个与该哈希值匹配的输入


这就是为什么leppie说您不能解密哈希值,因为您在创建哈希值时丢失了无法恢复的信息。除非您有约束或其他信息,否则您将陷入困境。

“我有一个哈希解密函数”实际上您没有。@leppie为什么我没有?哈希函数的属性是它们不能反转。这是什么语言(添加标记)?
f
应该是什么?你到底想做什么?你有什么问题?散列“加密”函数在哪里?请提供输入/输出示例和期望值。您的问题很不清楚。@ArtjomB。我添加了加密代码,并更新了我的问题。@ArtjomB。我正在寻找一个算法,我不会指定语言谢谢你的回答,但是如果循环直到他为0,我在最后一个循环中有一个不必要的数字
7
。对不起,我没有看到你以7开头。循环到7点。