2016-12-17 15 views
0

我正在寻找一个简单的哈希函数,它不依赖整数溢出,并且不依赖于无符号整数。如何在没有无符号整数的情况下制作好散列函数?

问题是我必须在虚幻引擎的蓝图中创建哈希函数(只有签名为32位整数,未定义的溢出行为),并且在PHP5中使用64位有符号整数的版本。

所以当我使用'通用'简单散列函数时,它们在两个平台上都不会给出相同的结果,因为它们都依赖于无符号整数的位溢出行为。

唯一真正重要的是具有良好的“随机性”。有没有人知道简单的事情会做到这一点?

它意味着一个非常基本的签名系统发送消息到服务器。不需要成为最高安全级别......这是为了在服务器上存储高分数的简单游戏。我的想法是,我会从消息中生成几个哈希整数(使用不同的'起始数字')并将它们附加到一个哈希签名中。我只需要确保,如果人们嗅探发送到服务器的网络消息,他们不能轻易发送伪造的消息。他们需要为消息提供正确的散列签名,除非他们知道正在使用的散列函数,否则他们不应该这样做。当然,如果他们对游戏进行逆向工程,他们仍然可以'破解'它,但我不知道如何反击... 我无法访问虚幻引擎蓝图系统中的现有哈希函数。

回答

1

我会尝试的第一件事就是使用有符号整数来模拟无符号整数的行为,只要累积的散列值变得足够大以致可能会发生溢出,就会显式应用模运算符。

实施例中的代码C(道歉为穷人散列函数,但相同的技术应当适用于任何散列函数,至少在原则上):

#include <stdio.h> 
#include <string.h> 

int hashFunction(const char * buf, int numBytes) 
{ 
    const int multiplier  = 33; 
    const int maxAllowedValue = 2147483648-256; // assuming 32-bit ints here 
    const int maxPreMultValue = maxAllowedValue/multiplier; 

    int hash = 536870912; // arbitrary starting number 
    for (int i=0; i<numBytes; i++) 
    { 
     hash = hash % maxPreMultValue; // make sure hash cannot overflow in the next operation! 
     hash = (hash*multiplier)+buf[i]; 
    } 
    return hash; 
} 

int main(int argc, char ** argv) 
{ 
    while(1) 
    { 
     printf("Enter a string to hash:\n"); 
     char buf[1024]; fgets(buf, sizeof(buf), stdin); 
     printf("Hash code for that string is: %i\n", hashFunction(buf, strlen(buf))); 
    } 
} 
相关问题