如何在没有无符号整数的情况下创建好的哈希函数?

时间:2016-12-17 01:17:21

标签: hash integer signed

我正在寻找一个不依赖于整数溢出的简单散列函数,并且不依赖于无符号整数。

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

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

唯一真正重要的是具有良好的随机性'。有没有人知道一些简单的事情会实现这个目标

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

1 个答案:

答案 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)));
   }
}