2016-12-17 3 views
0

정수 오버플로에 의존하지 않고 부호없는 정수에 의존하지 않는 간단한 해시 함수를 찾고 있습니다.부호없는 정수없이 좋은 해시 함수를 만들려면 어떻게해야합니까?

언리얼 엔진 청사진 (정의되지 않은 오버 플로우 비헤이비어로만 32 비트 정수로만 서명 됨) 및 64 비트 부호있는 정수를 사용하는 PHP5에서 해시 함수를 만들어야하는 문제가 있습니다.

그래서 '공통'단순 해시 함수를 사용할 때 부호없는 정수의 비트 오버플로 동작에 의존하기 때문에 두 플랫폼 모두에서 동일한 결과를 제공하지 않습니다.

정말 중요한 것은 유일한 '임의성'이 있다는 것입니다. 누구든지 이것을 성취 할 수있는 간단한 것을 알고 있습니까?

이것은 서버에 메시지를 보내는 매우 기본적인 서명 구문을 의미합니다. 최상위 보안이 될 필요는 없습니다 ... 단순한 게임의 높은 점수를 서버에 저장하기위한 것입니다. 아이디어는 (다른 '시작 번호'를 사용하여) 메시지에서 여러 개의 해시 - 정수를 생성하고 해시 서명을 만들기 위해 추가 할 것입니다. 사람들이 네트워크 메시지를 스니핑하면 위조 된 메시지를 쉽게 보낼 수 없다는 것을 서버에 보냅니다. 그들은 올바른 해시 서명을 메시지와 함께 제공해야합니다. 해시 함수가 사용되는 것을 알지 못하면 해지 할 수 없습니다. 그들이 게임을 리버스 엔지니어링하면 물론 '해킹'할 수는 있지만 그 방법을 알지 못합니다. 언리얼 엔진 청사진 시스템에서 기존 해시 함수에 액세스 할 수 없습니다.

답변

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