用char缓冲器播种srandom

时间:2012-11-28 17:50:00

标签: c hash random

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

4 个答案:

答案 0 :(得分:0)

将字符串解析为您正在寻找的数字?如果是这样,试试这个:

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

编辑:来自您的评论:

  

我正在使用MD5来散列它

你想要获得你所追加的价值吗?那你就错过了散列的基本概念。你无法从哈希中获得哈希值,这就是重点。

答案 1 :(得分: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”)。

答案 2 :(得分: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位。

答案 3 :(得分:0)

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