Python 动态计算蛮力大小?

Python 动态计算蛮力大小?,python,math,brute-force,Python,Math,Brute Force,如何动态计算暴力方法的大小?例如,如果将0:0:0:0:0:0:0-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff打印到文件中,则需要多少迭代和空间?棘手的部分是当线路长度变化时。IP地址只是一个例子 这样做的目的是给出给定零件的格式和最大长度。所以,若变量类型为“%c”(char),maxlen为26,则迭代计数为26,文本文件中人类格式所需的空间为26+26(一个字符表示分隔符) 例如: 1.2.3.4需要7个字节 9.9.9.10需要8个字节 1.1.1.

如何动态计算暴力方法的大小?例如,如果将0:0:0:0:0:0:0-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff打印到文件中,则需要多少迭代和空间?棘手的部分是当线路长度变化时。IP地址只是一个例子

这样做的目的是给出给定零件的格式和最大长度。所以,若变量类型为“%c”(char),maxlen为26,则迭代计数为26,文本文件中人类格式所需的空间为26+26(一个字符表示分隔符)

例如:

  • 1.2.3.4需要7个字节
  • 9.9.9.10需要8个字节
  • 1.1.1.100需要9个字节
  • 5.7.10.100需要10个字节
  • 128.1.1.1需要9个字节
  • 等等

示例0.0.0.0-10.10.10.10:

  iterations = 0
  needed_space = 0

  for a in range(0, 11):
    for b in range(0, 11):
      for c in range(0, 11):
        for d in range(0, 11):
          line = "%d.%d.%d.%d\n" % (a, b, c, d)
          needed_space += len(line)
          iterations += 1

  print "iterations: %d needed_space: %d bytes" % (iterations, needed_space)
迭代次数:14641所需空间:122452字节

进入

结果:[1464112452]

使用离散数学:

IPv4地址空间为256
*
256
*
256
*
256=2^32=4294967296个地址

IPv6有2^128个地址(8组16个
*
16
*
16
*
16)

IPv4地址使用32位,因此32位*4294967296地址=如果存储在磁盘上

IPv6地址使用128位,因此128位*2^128地址=

使用离散数学:

IPv4地址空间为256
*
256
*
256
*
256=2^32=4294967296个地址

IPv6有2^128个地址(8组16个
*
16
*
16
*
16)

IPv4地址使用32位,因此32位*4294967296地址=如果存储在磁盘上


IPv6地址使用128位,因此128位*2^128地址=

首先从计算所需的行数开始。IPv6地址为128位,因此输出文件的长度为2128行。如果所有行都是空的,那么大约是3.4×1038字节。一个TB大约只有1012个字节,因此您需要3×1026个1 TB的硬盘驱动器来存储空行,然后再将任何数据放入其中


每行存储40个字节需要按比例增加存储空间

首先从计算需要的行数开始。IPv6地址为128位,因此输出文件的长度为2128行。如果所有行都是空的,那么大约是3.4×1038字节。一个TB大约只有1012个字节,因此您需要3×1026个1 TB的硬盘驱动器来存储空行,然后再将任何数据放入其中


每行存储40个字节需要按比例增加存储空间

将其分解为组件可能是一种方法;对于IPv4,您有四个部分,由三个点分隔,每个部分可以是1、2或3个字符(0-9、10-99、100-255)长。所以你的组合是:

comp_length = {1: 10, 2: 90, 3: 156}
您可以通过迭代每个组合计算出总长度:

def ipv4_comp_length(n=4):
    if n == 1:
        return comp_length
    res = {}
    for rest, restcnt in ipv4_comp_length(n-1).iteritems():
        for first, firstcnt in comp_length.iteritems():
             l = first + 1 + rest # "10" + "." + "0.0.127"
             res[l] = res.get(l,0) + (firstcnt * restcnt)
    return res

print sum( l*c for l,c in ipv4_comp_length().iteritems() )
请注意,这没有考虑记录分隔符(“1.2.3.4 1.2.3.5”中的空格)


扩展到IPv6应该非常简单——除非您想处理缩写的IPv6地址,如0::0==0:0:0:0:0:0:0:0。

将其分解为组件可能是一种方法;对于IPv4,您有四个部分,由三个点分隔,每个部分可以是1、2或3个字符(0-9、10-99、100-255)长。所以你的组合是:

comp_length = {1: 10, 2: 90, 3: 156}
您可以通过迭代每个组合计算出总长度:

def ipv4_comp_length(n=4):
    if n == 1:
        return comp_length
    res = {}
    for rest, restcnt in ipv4_comp_length(n-1).iteritems():
        for first, firstcnt in comp_length.iteritems():
             l = first + 1 + rest # "10" + "." + "0.0.127"
             res[l] = res.get(l,0) + (firstcnt * restcnt)
    return res

print sum( l*c for l,c in ipv4_comp_length().iteritems() )
请注意,这没有考虑记录分隔符(“1.2.3.4 1.2.3.5”中的空格)


扩展到IPv6应该非常简单——除非您想处理缩写的IPv6地址,如0::0==0:0:0:0:0:0:0:0:0。但这并不能确切地告诉它以人类格式需要多少空间,只能告诉二进制。但这并不能确切地告诉它以人类格式需要多少空间,只有binary.IPv6截断不能存在,因为它应该能够计算任何内容。IPv6截断不能存在,因为它应该能够计算任何内容。是的,诀窍是一行是15-40个字符,而不是固定长度:)是的,诀窍是一行是15-40个字符,而不是固定长度:)