使用char缓冲区对srandom进行种子设定

使用char缓冲区对srandom进行种子设定,c,hash,random,C,Hash,Random,我需要从字符串的散列生成一个种子。这个种子将被用来生成随机数,我可能会使用srandom,但是这个函数不接受一个字符缓冲区作为参数,它接受一个整数。是否有任何方法可以使用char缓冲区对srandom进行种子设定,或者有任何其他方法可以从散列键生成int种子。希望你能帮忙 将字符串解析为数字是您要查找的吗?如果是,请尝试以下方法: char buf[] = "12345678"; int number = strtol(buf, NULL, 10); srand(number); 编辑:根据您

我需要从字符串的散列生成一个种子。这个种子将被用来生成随机数,我可能会使用srandom,但是这个函数不接受一个字符缓冲区作为参数,它接受一个整数。是否有任何方法可以使用char缓冲区对srandom进行种子设定,或者有任何其他方法可以从散列键生成int种子。希望你能帮忙

将字符串解析为数字是您要查找的吗?如果是,请尝试以下方法:

char buf[] = "12345678";
int number = strtol(buf, NULL, 10);
srand(number);
编辑:根据您的评论:

我正在使用MD5来散列它


你想得到你散列的值吗?那么你就错过了散列的基本概念。你不能从散列中得到一个散列值,这就是问题所在。

因为到目前为止你还没有发布任何代码,我在这里做一些假设

char *strHash = "ABCD1234"; // could be anything, i.e. "HelloWorld!"

int intNumberFromHash = 0;
for(int intCurrentCharacter = 0; strHash[intCurrentCharacter] != '\0'; intCurrentCharacter++){
    intNumberFromHash <<= 8; // effectively multiply by 256
    intNumberFromHash += strHash[intCurrentCharacter];
}

srandom(intNumberFromHash);
%x修饰符将十六进制值转换为小写值,即abcd1234.%X将使用大写十六进制ABCD1234

char *hashKey = "helloWorld!"; /* your Hash pointer */

int intHash = 0;
int hashCarry = 0;
for(int i = 0; hashKey[i] != '\0'; i++){

    intHash ^= hashKey[i];  // XORing with current character

    hashCarry = intHash & 0xF0000000; /* getting 4 bits - MSBs */

    intHash <<= 4; // Multiplying it by 16 

    intHash += hashCarry >> 28; /* e.g 0xF0000000 becomes 0x0000000F */
}

srandom(intHash);
希望这有助于


上面的代码不会破坏任何HashKey位。

您可以使用initstate3,或者我遗漏了什么吗?

哈希值的类型是什么?我正在使用MD5对其进行哈希,输出返回到char类型的缓冲区中。您是在使用强安全性,还是只是快速破解?我删除了我的答案,寻找更好的答案,但是我用的sscanf有什么问题吗?你正在用strtol做什么对不起,你能不能再详细解释一下?@Omkant sscanfbuffer,%d,number;将调用未定义的行为,因为scanf需要指向其输出参数的指针。strtol函数是字符串到整数转换的标准方式。好了,我应该用&number,谢谢。我想知道如何使用散列值作为随机函数的种子
char *hashKey = "helloWorld!"; /* your Hash pointer */

int intHash = 0;
int hashCarry = 0;
for(int i = 0; hashKey[i] != '\0'; i++){

    intHash ^= hashKey[i];  // XORing with current character

    hashCarry = intHash & 0xF0000000; /* getting 4 bits - MSBs */

    intHash <<= 4; // Multiplying it by 16 

    intHash += hashCarry >> 28; /* e.g 0xF0000000 becomes 0x0000000F */
}

srandom(intHash);