【发布时间】:2016-08-09 22:06:07
【问题描述】:
var alphaNumbersStr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var hexaString = '0123456789abcdef';
var str32 = '4af27d7ef70b1263da25022af735508b';
var str = 'FoooooBar';
var arr = [];
for (var i = 0; i < str.length; i++) {
arr[i] = alphaNumbersStr.indexOf(str.charAt(i));
}
// --
// Start : arr ==> [ 31, 14, 14, 14, 14, 14, 27, 0, 17 ]
// --
for (var i = 0; i < 10000; i++) {
arr[i % str.length] += hexaString.indexOf(str32.charAt(i % 32)) ^ arr[(i + 1) % str.length] ^ arr[(i + 2) % str.length];
if (arr[i % str.length] > alphaNumbersStr.length - 1) {
arr[i % str.length] %= alphaNumbersStr.length;
}
}
// --
// End : after 10000 iterations : arr ==> [ 38, 8, 32, 4, 18, 24, 2, 48, 22 ]
// --
鉴于以下 sn-p,我正在尝试反转此算法,以便我可以返回到原始数组状态(步骤 0)。
知道如何解决这个问题吗?
【问题讨论】:
-
您能否通过将每个表达式存储在正确命名的变量中来清理代码?即
var oldIndexBasedOnMonth = str32.charAt(i % 32);. -
当您使用 JS 编写代码时,我实际上认为这更像是一个数学问题而不是 JS 问题。给定一个数学解决方案,我认为编写所需的 JS 代码是微不足道的。
-
出于好奇:这个问题的背景是什么?这是一些竞争问题吗?还是有人试图构建一个糟糕的(想要难以逆转的)哈希函数?
-
hexaString.indexOf(str32.charAt(i % 32))是静态映射,^是对称的,%仅用于将值钳制/折叠到范围内(0..alphaNumbersStr.length)。您只需要更改 3 件事arr[i % str.length] +=->-=,您必须针对负值调整钳位,并且您必须以相反的顺序执行此循环
标签: javascript algorithm hash bitwise-operators modulo