我要创建文本文件还是数据库?以下两个十六进制值之间的所有可能的十六进制值。
00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962
002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20
约束是:
有人可以帮助我了解甚至有多少种可能性吗?或帮助我了解这是否是一个现实的选择? 我当时在考虑使用类似Crunch的方法来生成文本文件输出,但是想先看看这是否是现实的,并且在弄清楚如何对其进行数学运算时遇到了麻烦。我真的很想了解如何通过数学运算来解决这个问题。
为了弄清楚数学,您可以简化十六进制值,但是需要进行解释。
答案 0 :(得分:1)
所有数字的粗略估算值
正如阿兰·梅里戈特(Alain Merigot)表示的那样,您只需计算从第一次更改(从MSB到LSB)的位数:
00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962h
002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20h
|<---------------------60 digitis------------------------->|
为我们提供了16^60
的可能性。如果您想要小数,那么转换是这样完成的:
dec_digits/hex_digits = log(16)/log(10) = 1.204119982655924780854955578898
dec_digits = hex_digits * 1.204119982655924780854955578898
dec_digits = 60 * 1.204119982655924780854955578898 = ~72.25
因为任何基数的整数之间的比率是恒定的,从而导致10^72.25
的可能性。
所有数字精确
简单地减去2个数字,以使结果为非负数(如果没有bigints,则可以在具有单for循环的字符串上使用)
-00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962h
+002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20h
------------------------------------------------------------------
000007D101F55B75E1FDABFA6510D6D90E11DFD3006E79EDEA21AA5B744514BEh
如果我使用此str_hex2dec将其转换为dec,结果为:
53947059527385558921671339033187394318456441692296348428515181989270718 = 5.39*10^70
我们也可以根据十六进制进行粗略估算:
000007D101F55B75E1FDABFA6510D6D90E11DFD3006E79EDEA21AA5B744514BEh
||<----------------------58 hex digits------------------->|
|
7h -> 0111b -> 3 bits
因此,我们得到59个十六进制数字,每个十六进制数字是4个二进制位,除了第一个是3位,仅提供了粗略的估计(但比#1精确得多):
3 + 58*4 = 235 bits -> 2^235 numbers
再次转换为十进制:
235 * log(2)/log(10) = 70.74
导致估算:
10^70.74 = 10^0.74 * 10^70 = 5.4954*10^70
与上面的真实交易非常接近。
重复数字约束
这个很复杂。我们需要用重复的数字减去所有可能数字的计数。那是概率数学(不是我的强项),但是您可以这样处理:
例如,我们有58个十六进制数字。那么,在那里可以有多少个像n=4
这样的7777
位数字呢?如果我们将7777
从头到尾放在digits-n = 58+1-4
可能的位置...
对于每个位置,所得数字可以具有“任意”组合,因此可能性将乘以未使用的数字可能性:
(digits+1-n)*16^(digits-n)
现在是n = <4 , digits>
,因此可能性结合在一起:
(digits+1-4)*16^(digits+1-4) + (digits+1-5)*16^(digits-5) + (digits+1-6)*16^(digits-6) ... + 1
(digits-3)*16^(digits-4) + (digits-4)*16^(digits-5) + (digits-5)*16^(digits-6) ... + 1
现在重复的数字可以是0..F
中的任何数字,因此整个stuf也要乘以16 ...
(digits-3)*16^(digits-3) + (digits-4)*16^(digits-4) + (digits-5)*16^(digits-5) ... + 16
同样,这是粗略估计,不考虑边缘情况和重复性(您知道重复次数是2次还是更多,而不是一次,因此重复序列的相邻数字也不能具有相同的数字值,等等...正确地考虑所有情况将导致疯狂的方程式,与粗略估算值相差不大),因此所得的粗略估算值为:
16^digits - sum[i=1,2,3,...,digits-3]( i*16^i )
现在创建将是“简单的”,您只需在字符串中实现十六进制值的增量并测试有效性(重复):
1. increment
2. test validity
3. if valid store result
4. if end still not reached goto 1
但是,结果数据将非常庞大,并且为此也需要计算能力……因此,您很可能在完成工作之前就染上了旧染料,更不用说在那之前就填满存储空间了……