十六进制(数字)所需的数学指导

时间:2019-07-10 04:42:05

标签: math numbers hex

我要创建文本文件还是数据库?以下两个十六进制值之间的所有可能的十六进制值。

00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962
002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20

约束是:

  • 64位十六进制值
  • 仅位于上述两个数字之间。
  • 最多只能重复3个相同的值(例如777可以,但7777不能。)

有人可以帮助我了解甚至有多少种可能性吗?或帮助我了解这是否是一个现实的选择? 我当时在考虑使用类似Crunch的方法来生成文本文件输出,但是想先看看这是否是现实的,并且在弄清楚如何对其进行数学运算时遇到了麻烦。我真的很想了解如何通过数学运算来解决这个问题。

为了弄清楚数学,您可以简化十六进制值,但是需要进行解释。

1 个答案:

答案 0 :(得分:1)

  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. 所有数字精确

    简单地减去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
    

    与上面的真实交易非常接近。

  3. 重复数字约束

    这个很复杂。我们需要用重复的数字减去所有可能数字的计数。那是概率数学(不是我的强项),但是您可以这样处理:

    例如,我们有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

但是,结果数据将非常庞大,并且为此也需要计算能力……因此,您很可能在完成工作之前就染上了旧染料,更不用说在那之前就填满存储空间了……