我如何生成一组长度完全等于 8 的所有标记

how do I generate set of all tokens of length exactly equal to 8

我需要生成大小完全等于 8.Each 的完整令牌集,令牌中的位可以采用 0 - 9A -Z 中的值。例如-

以下是有效的标记: 00000000 0000000A 000000H1 Z00000XA

所以基本上我想生成从 00000000 到 ZZZZZZZZ 的所有令牌。 我如何在 C

中执行此操作

这里根本不需要递归或嵌套循环。

您只需要一个从 0 到 368-1 的计数器,然后将结果转换为以 36 为基数的输出。

也就是说,368 个字符串,每个字符串的长度为 8 个字节,即 22,568,879,259,648 个字节,或大约 20.5 TB 的数据。

假设持续速率为每秒 100 兆字节,将所有数据写入某些硬盘大约需要 63 小时。

你在我不想做我应该做的事情的那一天抓住了我1.

以下代码只生成token输出;它不会尝试在任何地方存储令牌。您可以将输出重定向到一个文件,但正如其他人指出的那样,您将需要一个更大的 boat 硬盘来存储 368 字符串。可能有一种方法可以在没有嵌套循环的情况下执行此操作,但这种方法非常简单。第一个循环更新每个位置的计数器,而第二个循环将计数器映射到一个符号并将该符号写入标准输出。

您可以将 LEN 设置为更小的值,例如 3,以验证程序是否按照您的要求运行,而不会产生数 TB 的输出。或者,您可以为数字使用一组较小的字符。理想情况下,LENdigs 都应该是命令行参数而不是常量,但我已经在这上面花了太多时间了。

编辑

好吧,我撒谎了。显然我没有花太多时间在这上面,因为我已经清理了一个小错误(第一个字符串没有正确显示,因为我在显示之前进行了更新)并且我已经设置了长度和字符集命令行输入。

请注意,此代码假定为 C99。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEFAULT_LEN 8

int main( int argc, char **argv )
{
  const char *default_digs="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  size_t len = DEFAULT_LEN;
  const char *digs = default_digs;

  if ( argc > 2 )
    digs = argv[2];

  if ( argc > 1 )
    len = strtoul( argv[1], NULL, 10 );

  int idx[len];
  memset( idx, 0, sizeof idx );

  size_t diglen = strlen( digs );

  for(;;)
  {
    int j = len;
    while( j )
      putchar( digs[idx[--j]] );

    putchar( '\n' );

    while ( j < len && idx[j] == diglen - 1 )
      idx[j++] = 0;

    if ( j == len )
      break;

    idx[j]++;
  }

  return 0;
}

示例输出:

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 01
00
01
10
11

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 3 01
000
001
010
011
100
101
110
111

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 012
00
01
02
10
11
12
20
21
22


1。公平地说,几乎任何一天都以 'y'.
结尾