如何在C ++中生成一组唯一的哈希字符串?

时间:2013-10-01 09:40:02

标签: c++ arrays string random generator

此代码生成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);

复制生成的hasname,但它正在复制生成的最后一个hashname,所以无论我在哪里使用tr0->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char)); strcpy(tr0->Variables[0].hashname,(char*)vcd_xyz);只有zzzz得到打印。我做错了什么或者我应该怎么做才能将hashname分配给顺序的方式。

1 个答案:

答案 0 :(得分:0)

首先,你需要意识到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;
}

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

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容器中,直到您拥有足够的字符串,或者您可以生成此字符串的更多唯一组合,将所有这些组合成{{1} },将其改组并先选择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 << ' '; 。完整示例here