1

我需要从字符串的散列生成种子。这个种子将用于生成随机数,我可能会使用 srandom(),但是这个函数不将 char 缓冲区作为参数,它需要一个整数。有什么方法可以使用 char 缓冲区播种 srandom,或者有任何其他方法可以从哈希键生成 int 种子。希望你能帮忙!

4

4 回答 4

0

将字符串解析为您要查找的数字吗?如果是这样,试试这个:

char buf[] = "12345678";
int number = strtol(buf, NULL, 10);
srand(number);

编辑:根据您的评论:

我正在使用 MD5 对其进行哈希处理

你想取回你散列的值吗?那么你就错过了散列的基本概念。您无法从散列中取回散列值,这就是重点。

于 2012-11-28T17:57:22.033 回答
0

由于您到目前为止没有发布任何代码,因此我在这里做一些假设。

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);

此代码将从“字符串”生成“数字”。然而,它不是很聪明(即它会经常溢出,最后只有最后四个字符真正做任何事情)。如果哈希是十六进制值,您可能想要做这样的事情。

sscanf(theHash,"%x",number);
srandom(number);

%x修饰符会将十六进制值转换为小写值(即“abcd1234”)。%X将做大写十六进制(“ABCD1234”)。

于 2012-11-28T18:00:35.220 回答
0
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 位。

于 2012-11-28T18:30:49.917 回答
0

您可以使用 initstate(3),还是我错过了什么?

于 2012-11-28T21:27:20.857 回答