【问题标题】:How to generate a set of unique hash strings in C++?如何在 C++ 中生成一组唯一的哈希字符串?
【发布时间】:2013-10-07 10:00:14
【问题描述】:

此代码生成 26*26*26*26 hasname(使用 az 的组合),或者您可以说出我想分配给结构成员的随机名称。现在,当我通过首先分配该结构成员足够的内存来分配它时然后使用strcpy,只有这个代码生成的最后一个hashname被传递给结构,即zzzz(它是最后一个hashname)。我该怎么做才能从头开始分配hashname。

vcd_xyz[4] = '\0';
int  count = 0;
for(int i=0;i<26;i++)
{
    vcd_xyz[0] = 'a'+i;
    for(int j=0;j<26;j++)
    {
        vcd_xyz[1] = 'a'+j;
        for(int k = 0;k<26;k++)
        {
            vcd_xyz[2] = 'a' + k;
            for(int l=0;l<26;l++)
            {
                vcd_xyz[3] = 'a' +l;
                count ++;
                printf("%s\n",vcd_xyz);
            }
        }
    }
}

所以我正在使用

sss->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char));
strcpy(sss->Variables[0].hashname,(char*)vcd_xyz);

复制生成的哈希名,但它正在复制最后生成的哈希名,所以无论我在哪里使用tr0->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char)); strcpy(tr0->Variables[0].hashname,(char*)vcd_xyz);,只有 zzzz 会被打印出来。我做错了什么或者我应该怎么做才能按顺序分配哈希名.

【问题讨论】:

  • 请写出您想要 C 还是 C++ 解决方案,相应地删除这些标签之一并写出您正在使用的编译器。
  • @LihO:任何一个都可以工作..因为我在 g++ 中编译

标签: c++ arrays string random generator


【解决方案1】:

首先你需要意识到char vcd_xyz[4]是一个4个字符的数组,这意味着你可以放3个字符+终止字符'\0'。如果您将此数组视为以空值结尾而不是空终止,则会导致未定义的行为

您的代码实际上所做的是它遍历所有可能的 4 个字母长字符串组合,从 "aaaa""zzzz",留下 vcd_xyz 数组填充最后一个组合(即 "zzzz")。


如果你想生成随机的 4 个字母的长字符串,这里是你可以使用的 C 风格函数:

int irand(int min, int max) {
    return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}

它从&lt;min;max&gt;区间生成随机数,可以这样使用:

std::string generateHashTag() {
    char str[5];
    for (int i = 0; i < 4; ++i)
        str[i] = irand('a', 'z');
    str[4] = '\0';
    return std::string(str);
}

但如果您想生成一组独特的 4 字母长哈希标签,则需要更复杂的解决方案。在 C++ 中,您可以轻松地在循环中生成这些字符串,然后将它们放入 std::set 容器中,直到您拥有足够的它们,或者您可能会生成此字符串的更多独特组合,将所有这些放入 std::vector 中,随机播放并首先选择N,例如:

const size_t N = 5;
std::set<std::string> myHashTags;

srand(time(0));
while (myHashTags.size() < N)
    myHashTags.insert(generateHashTag());

for (std::set<std::string>::iterator i = myHashTags.begin();
     i != myHashTags.end(); ++i)
     std::cout << *i << ' ';

输出kemy snwv vnmi wfmm wqeg。完整示例here

【讨论】:

  • 我已经完成了随机字符变量,但我无法从它们的生成开始传递它们,而是只传递最后生成的哈希名。
  • @shailendra:你误解了我的意思。您没有生成哈希名称,您只是遍历了所有可能的组合,以 zzzz 结尾。
  • 好的..我仍然对此感到困惑,所以当我使用您的代码并打印str 时,我怎样才能获得那些不同的哈希名,它只打印一个随机名称,如果可能的话,如何我可以使用我的代码生成 hashname,而不是遍历它们...
  • 因为在我的另一个代码中,当代码有点不同时,它存储了 aaaa,然后产生了 seh 错误
  • 我要问的是我必须为存储一些变量的结构分配一个随机哈希名。意味着有一个代码可以读取文件,解析它,并找到一些信号名称,但是它们很大,所以我想做的是生成随机哈希名并将它们存储在这些结构中,这样在将这些信号写入文件时,我可以用它们的哈希名替换它们,以减少文件的大小.. ..我发现创建随机哈希名的最简单方法是这个..
猜你喜欢
  • 2015-05-22
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多