雜湊遊戲系統開發原始碼+搭建思路詳解

v_ch3nguang發表於2023-04-07

雜湊(Hash )是一種加密演演算法,也稱為雜湊函式或雜湊函式。 雜湊函式是一個公共函式,它可以將任何長度 M 的訊息對映到一個 短且固定長度的值 H M ),稱為 H M )作為雜湊值 、雜湊值

 

Hash Value )、雜湊值或者訊息摘要。 它是一種單向密碼系統,即從明文到密文的不可逆對映。只有一個加密過程,但沒有解密過程。

 

1 、單調性( Monotonicity ):單調性是指如果已經有一些內容透過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。

  
2 、負載( Load ):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的使用者對映為不同
的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演演算法應能夠儘量降低緩衝的負荷。


3 、平衡性( Balance ):平衡性是指雜湊的結果能夠儘可能分佈到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演演算法都能夠滿足這一條件。

 

4、 分散性(Spread ):在分散式環境中,終端有可能看不到所有的緩衝,而是隻能看到其中的一部分。當終端希望透過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同
,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分
散性的定義就是上述情況發生的嚴重程度。好的雜湊演演算法應能夠儘量避免不一致的情況發生,也就是儘量降低分散性。

 

 

/*

  * @Author: Carlos

  * @Date: 2020-07-2 23:48:50

  * @LastEditTime: 2020-07-2 23:48:50

  * @LastEditors: Carlos

  * @Description: Hash

  */

#include "stdio.h"

#include "stdlib.h"

#define HASHSIZE 7 // 定義雜湊表長為陣列的長度

#define NULLKEY -1

typedef struct

{

     int *elem; // 資料元素儲存地址,動態分配陣列

     int count; // 當前資料元素個數

} HashTable;

/**

  * @Description: 雜湊函式初始化

  * @Param: HashTable *hashTable 結構體指標

  * @Return:

  * @Author: Carlos

  */

void Init(HashTable *hashTable)

{

     int i;

     hashTable->elem = (int *)malloc(HASHSIZE * sizeof(int));

     hashTable->count = HASHSIZE;

     for (i = 0; i < HASHSIZE; i++)

     {

         hashTable->elem[i] = NULLKEY;

     }

}

/**

  * @Description: 雜湊函式 ( 除留餘數法 )

  * @Param: int data 雜湊的資料

  * @Return: 雜湊後 data 儲存的地址

  * @Author: Carlos

  */

int Hash(int data)

{

     return data % HASHSIZE;

}

/**

  * @Description: 雜湊表的插入函式,可用於構造雜湊表

  * @Param: HashTable *hashTable 結構體指標, int data 雜湊的資料

  * @Return:

  * @Author: Carlos

  */

void Insert(HashTable *hashTable, int data)

{

     int hashAddress = Hash(data); // 求雜湊地址

     // 發生衝突

     while (hashTable->elem[hashAddress] != NULLKEY)

     {

         // 利用開放定址法解決衝突

         hashAddress = (++hashAddress) % HASHSIZE;

     }

     hashTable->elem[hashAddress] = data;

}

/**

  * @Description: 雜湊表的查詢演演算法

  * @Param: HashTable *hashTable 結構體指標, int data 雜湊的資料

  * @Return:

  * @Author: Carlos

  */

int Search(HashTable *hashTable, int data)

{

     int hashAddress = Hash(data); // 求雜湊地址

     while (hashTable->elem[hashAddress] != data)

     { // 發生衝突

         // 利用開放定址法解決衝突

         hashAddress = (++hashAddress) % HASHSIZE;

         // 如果查詢到的地址中資料為 NULL ,或者經過一圈的遍歷回到原位置,則查詢失敗

         if (hashTable->elem[hashAddress] == NULLKEY || hashAddress == Hash(data))

         {

             return -1;

         }

     }

     return hashAddress;

}

int main()

{

     int i, result;

     HashTable hashTable;

     int arr[HASHSIZE] = {13, 29, 27, 28, 26, 30, 38};

     // 初始化雜湊表

     Init(&hashTable);

     // 利用插入函式構造雜湊表

     for (i = 0; i < HASHSIZE; i++)

     {

         Insert(&hashTable, arr[i]);

     }

     // 呼叫查詢演演算法

     result = Search(&hashTable, 29);

     if (result == -1)

         printf(" 查詢失敗 ");

     else

         printf("29 在雜湊表中的位置是 :%d", result + 1);

     return 0;

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70028290/viewspace-2944448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章