雜湊演算法基本介紹 可以推廣

2021-10-04 10:02:47 字數 2398 閱讀 8071

雜湊演算法是一種便於查詢字串的演算法

模板傳送

雜湊演算法(hash)其實就是把字串轉化為自己想要的雜湊值,這個值由自己的來定義。

列如:

給你一堆字串,判斷裡面有多少個回文字串,聽起來很簡單是不是?但是要是這個字串的資料很大,而且你不能用c++函式的輔助呢?(這裡是舉個列子哈,畢竟雜湊的用處很廣)這裡就很容易超時,這時候我們就要將每個字串做出一定的處理,使得判斷是否為回文的時候只需要o(1)的時間就夠了。

正式介紹:

雜湊就是把題目給出的字串,做出乙個處理(類似進製轉換)。如:給你字串 abcd 與 abde。我們就可以定義乙個int hash[size]的陣列把每個字串轉化成int型別來儲存(因為這樣可以直接比較是否相等,字元陣列則不行)

雜湊值

我們再定義乙個進製num = 277(先可以理解為隨意定,後面再解釋為什麼不可以隨意)我們就可以這樣

char str[4]

="abcd"

;int ans =0;

for(

int i =

0;i <

4;i++

) ans = ans *

num(轉化進製)

+(str[i]

-'0'

);

這個ans就是雜湊值,再比較倆個字串的雜湊值相不相等就容易了,那麼問題隨之而來,當字串很長時,那豈不是要爆掉int了?這裡我們就要再定義乙個模數mod = 很大的乙個數,這樣就不會爆掉了(最好開unsigned long long)。

雜湊衝突

但是問題還是有,雜湊值一樣,難道字串就一點相等嗎?(如 3 + 7 = 10 和 5 + 5 = 10 一樣)無論多好的雜湊處理,都存在雜湊衝突,也就是存在這種雜湊值相等但是字串不等的情況。在這裡我們就是盡可能的降低這種雜湊衝突。

如何降低雜湊衝突

與你的進製和模數相關。眾所周知,ascill碼有230多(應該叭。。沒記那麼清楚),那麼這個進製一定要選得比他大,但是也不是過度的大,257,277,599,1533,2634198563(合理的隨意)這些都可以,但是不要選擇模數的因數(不然模數怎麼模,沒意義了)。

接下來就是模數的選擇了,最好找乙個超級大的質數,(不然很容易被隨機資料給卡掉了),這個質數多大呢?最好不要1e9以內,和題的資料很容易衝突,如果能找到乙個1e18的質數就是最好的事情了。如19999999999999997等等。

但是,這不代表你不會被卡,只要出題人夠狠,再好的雜湊等於白給,這裡只是講一種思路,一種轉化方法,可以延伸到很多難題上面(傷心,我還是這麼的菜)。

模板題很好,建議初學者去做做

這裡附上我的模板題**(看不看都差不多啦。。。)

#include

using

namespace std;

#define newnode (treenode *)malloc(sizeof(treenode))

#define mem(a,b) memset(a,b,sizeof(a))

const

int n =

5e5+5;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-10

;const

unsigned

long

long mod =

19999999999999997

;const

int ii =

3.1415926535

;typedef

long

long ll;

typedef

unsigned

long

long ull;

ull hash[

10050];

char str[

10050];

int num =

279;

ull hash

(char str)

intmain()

int sum = n;

sort

(hash+

1,hash+n+1)

;for

(int i =

1;i < n;i++)if

(hash[i]

== hash[i+1]

) sum--

; cout << sum << endl;

}

雜湊演算法 介紹

1 概念 在資訊保安技術中,經常需要驗證訊息的完整性,雜湊 hash 函式提供了這一服務,它對不同長度的輸入訊息,產生固定長度的輸出。這個固定長度的輸出稱為原輸入訊息的 雜湊 或 訊息摘要 message digest 乙個安全的雜湊函式h必須具有以下屬性 l h能夠應用到大小不一的資料上。2 h能...

雜湊演算法(Hash函式)簡單介紹

雜湊演算法的定義和原理 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則,就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法,需要滿足下面幾點要求 a.從雜湊值不能反向推導出原始資料 所以雜湊演算法也叫單向雜湊演算法 b.對輸入的資料比較...

Redis 雜湊 Hash 介紹與基本操作

redis的雜湊可以讓使用者將多個鍵值對存在乙個redis鍵裡面,可以把一些相關資料存在一起,就像關聯式資料庫的行。命令操作 hget hmget的單引數版本 一次操作乙個值 hset hmset的單引數版本 一次操作乙個值 hmget hmget key name key key 從雜湊裡面獲取乙...