找到这些数字的模式

时间:2009-10-22 14:13:45

标签: algorithm

我目前正在开展一个项目。在这个项目中,我有一组遵循特定算法的数据。我必须找到模式。

 1    355138022809833    RUPQ730562P    247001    20578330    70175500    
 2    355138022809841    RUPQ730563D    247001    72754950    71957850    
 3    355138023475287    RVSQ831978E    247001    39374170    25101090    
 4    355138023475295    RVSQ831979F    247001    06260280    87190670    
 5    355138023475303    RVSQ831980L    247001    05025410    26440510    
 6    355138023475352    RVSQ831985Y    247001    96637700    48209200    
 7    355138023475360    RVSQ831986A    247001    27362620    70790740    
 8    355138023475378    RVSQ831987P    247001    16576600    30002180    
 9    355138023475386    RVSQ831988D    247001    74778020    98010580      
10    355138023475402    RVSQ831990M    247001    25716170    97946520    

第一列是序列号。接下来的3列是将给出的输入。接下来的2是算法的输出。

所以基本上

我有3个变量x,y,z(上述数据的第2,第3,第4列)

并且

y1 = f1(x, y, z)

y2 = f2(x, y, z)

y1是以上数据的第5列

y2是以上数据的第6列

我有以上数据。现在我需要找到函数f1和f2。

我应该遵循什么程序?必须采取什么措施?

Krishna Kant Sharma的编辑1

我发布此问题是为了不要求回答算法。当我们在变量中也有字母表时,我只是要求采取必要的步骤来解决这些问题。根据我的经验,这是第一次有一小部分stackoverflow社区的行为像封闭的人一样。堆栈溢出的重点是什么?我们在这里互相帮助,了解和解决问题。当我们中的一些人需要帮助时伸出援助之手。那么为什么我们不要停止在一些技术纯度(如字母不是字母字符)周围跳动,并解决主要问题。

更多数据

11   355138023475436  RVSQ831993L   247001   07481830   49057990 
12   355138023475444  RVSQ831994T   247001   65090950   87729430 
13   355138023475451  RVSQ831995B   247001   06689330   60021180 
14   355138023475469  RVSQ831996K   247001   05784310   69836640 
15   355138023475477  RVSQ831997Z   247001   13157740   35850670 
16   355138023475485  RVSQ831998Y   247001   68658020   77311320 
17   355138023475501  RVSQ832000N   247001   01567780   26994970 
18   355138023475519  RVSQ832001E   247001   43775370   58120770 
19   355138023475527  RVSQ832002F   247001   42463550   55145190 
20   355138023475535  RVSQ832003R   247001   85766840   15491950    

9 个答案:

答案 0 :(得分:5)

您应该采取的第一步是了解此输入数据的上下文。然后,您可以选择对结果列可能是什么以及在该上下文中通常使用的算法/函数进行假设。

接下来的一点是分析自己的输入数据,寻找与现实世界相关的模式和匹配(例如邮政编码,序列号,日期等)。因此,你应该看看输入的不同部分,但同样也是输入块。

如果你之前没有成功,除了试错之外你别无选择。你仍然可以通过查看输入数据来解决一些函数或算法(例如,字母会使典型的数学函数无效,所以也许它是一些散列函数。)

详细说明您的输入数据:

  • x的最后一个字符(以及y)看起来像一个校验和字符,所以如果你查找模式,请检查没有最后一个字符的数字/文字
  • y中的字母可能是货币,业务流程或其他内容的常见缩写
  • 结果列中的最后一个0也可能是一些校验和字符或取决于z列(没有足够的数据可以告诉)

我会在输入数据的某些组合上尝试一些(常见的)哈希函数,这些组合产生8位数的结果并查找结果。

答案 1 :(得分:4)

很抱歉,但我认为你所要求的是不可能的(从计算的角度来看)。

这些数据来自的系统可以做,比方说,

SELECT Y1, Y2 FROM my_secret_data WHERE Col1 = x AND Col2 = Y and Col3 = Z;

my_secret_data包含非计算派生的值。

因此,除非您拥有基础表,否则您永远无法找到解决它的算法(除非您拥有输入和输出的所有可能组合 - 这将意味着重建整个表)

外部计算,我认为你可以做的就是寻找模式,并尝试找出输入/输出值代表什么,并看看它带你去哪里。

修改

在某些情况下,一切都不会丢失;如果输入,输出和算法使用的任何函数都是连续的(因为输入是字母数字,这看起来不是这里的情况),情况会有所不同。

如果是,你可以(可能)通过interpolating(也许是神经网络)找到算法,但在这种情况下,给定值,我认为你需要更多的样本数据。

答案 2 :(得分:3)

查看第5行和第6行。所有3个输入参数都相同,但输出不同。我认为只有你给我们的数据才能解决这个问题。

答案 3 :(得分:2)

你在哪里获得这些,以及它们是如何被使用的?

如果使用真实f1和f2的实体正在使用它们进行身份验证,并且它们完全是智能的,那么f1和f2将成为加密安全功能,并且您基本上没有机会破坏它们。如果它们只是校验和,您可以尝试使用常见的校验和算法。我将从维基百科开始。

您可以获得多少数据?你能得到任意输入的f1和f2的值,还是仅限于你能观察到的值?如果您可以观察一个字符不同的输入值,您可以看到它所做的更改有多少。如果结果大致相同,那么它不是加密哈希,而且你有更好的机会。

这对您和您的公司有多重要?我说你很少有成功的机会,除非我现在看到的不止这些。任何解决方案极有可能涉及大量的暴力搜索。

顺便说一句,在您的求解过程中,请勿使用所有数据。您可以提出某种功能来适应任何数据点。保留一些数据以供测试,以查看派生函数是否适用于外部数据。

最后,这是否符合道德标准?你还没有告诉我们这些数字来自何处,而且看起来似乎是另一家公司出于安全目的而生成的东西,而且他们的意图可能是好的或坏的。这是值得思考的问题,如果只是因为一个对他人行为不道德的公司可能会对其员工表现出不道德的行为。

答案 4 :(得分:0)

您始终可以定义分段函数:

F1(355138022809833,RUPQ730562P,247001)= 20578330 F1(355138022809841,RUPQ730563D,247001)= 72754950

等。因为你不需要连续性。

答案 5 :(得分:0)

鉴于样本数据中的z值没有变化,可以将其删除。如果您只有数据,那么实际上没有解决此问题的通用方法。另一方面,如果您能够使用自己设计的任意输入来测试函数,则可以使用类似于差分密码分析的技术。

答案 6 :(得分:0)

这似乎是一个神经网络最好解决的问题。希望你能获得更大的数据集来训练!

答案 7 :(得分:0)

如果您确定有模式,可以尝试machine learning种技巧。但是你设置和训练“机器”的数据集很小(每个只有10个)。您还需要进行预测,因此有些算法对集群,分类,关联挖掘不起作用。神经网络将是一种技术。这是你可以尝试的选项。不幸的是,我不是机器学习/数据挖掘专家,不能告诉你的方式。对于Java,请查看WEKA

答案 8 :(得分:0)

从不同角度看数据:

  • 出现什么值,哪些数字。

  • 看看差异。这暴露了x和y是连续的,并且当你去掉最后一个数字/字母时有一个紧密的关系。

  • 看看模式。 y1从06开始,然后是05,第4,5和13,14行。序列号减去校验位的差值为16.这可能是巧合,也可能不是。

  • 运行统计测试(此处没有太多数据)。

  • 查看各种数字系统中的数据(十六进制,二进制)。

  • 查看数字的素数分解。

  • 查看数据中微小差异的影响。

  • 您最初可能希望排除前两行,因为它们的序列号远远不同于其他行,这可能会模糊可能的模式。

尝试尽可能多地找出有关计算的背景知识。

密码分析的一些知识也不错。

然后编制一些工作假设,如何计算y1和y2值并对其进行测试。例如,我要检查的第一个是使用shift和xor(可能是CRC),或者序列号模数为10000000的某些线性函数,而忽略尾随零。

冲洗并重复。如果你有足够的耐心并且不太难以找到它。