我正在寻找一个不依赖于整数溢出的简单散列函数,并且不依赖于无符号整数。
问题在于我必须从虚幻引擎创建蓝图中的哈希函数(只有带有未定义溢出行为的32位整数)和PHP5中使用64位有符号整数的版本。
所以当我使用' common'简单的散列函数,它们不会在两个平台上给出相同的结果,因为它们都依赖于无符号整数的位溢出行为。
唯一真正重要的是具有良好的随机性'。有没有人知道一些简单的事情会实现这个目标
它意味着用于向服务器发送消息的非常基本的签名系统。不需要高级安全性......它可以在服务器上存储高分的简单游戏。我的想法是,我会从消息中生成几个哈希整数(使用不同的'起始数字')并附加它们以生成哈希签名)。我只需要确保如果人们嗅到发送到服务器的网络消息,他们就不能轻易发送伪造的消息。他们需要为他们的消息提供正确的散列签名,除非他们知道正在使用的散列函数,否则他们不应该这样做。当然,如果他们对游戏进行逆向工程,他们仍然可以“劈开”游戏。它,但我不知道如何反击...... 我无法访问虚幻引擎蓝图系统中的现有哈希函数。
答案 0 :(得分: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)));
}
}