ELFhash

字符串哈希算法(以ELFHash詳解)

?

更多字符串哈希算法請參考:http://blog.csdn.net/AlburtHoffman/article/details/19641123

先來了解一下何為哈希:

哈希表是根據設定的哈希函數H(key)和處理沖突方法將一組關鍵字映射到一個有限的地址區間上,并以關鍵字在地址區間中的象作為記錄在表中的存儲位置,這種表稱為哈希表或散列,所得存儲位置稱為哈希地址或散列地址。作為線性數據結構與表格和隊列等相比,哈希表無疑是查找速度比較快的一種。
通過將單向數學函數(有時稱為“哈希算法”)應用到任意數量的數據所得到的固定大小的結果。如果輸入數據中有變化,則哈希也會發生變化。哈希可用于許多操作,包括身份驗證和數字簽名。也稱為“消息摘要”。
?
簡單解釋:哈希(Hash)算法,即散列函數。它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。同時,哈希函數可以將任意長度的輸入經過變化以后得到固定長度的輸出。哈希函數的這種單向特征和輸出數據長度固定的特征使得它可以生成消息或者數據。
?
個人心得:哈希就是用進行函數映射,用key對應此時的值,然后對這個值進行查詢時直接對key的地址進行查看就好了,思想簡單,用起來真的復雜。我們還是簡單學一下ELFHash吧
// ELF Hash Function2 unsigned int ELFHash(char *str)3 {4     unsigned int hash = 0;5     unsigned int x = 0;6 7     while (*str)8     {9         hash = (hash << 4) + (*str++);//hash左移4位,把當前字符ASCII存入hash低四位。 
10         if ((x = hash & 0xF0000000L) != 0)
11         {
12             //如果最高的四位不為0,則說明字符多余7個,現在正在存第7個字符,如果不處理,再加下一個字符時,第一個字符會被移出,因此要有如下處理。
13             //該處理,如果最高位為0,就會僅僅影響5-8位,否則會影響5-31位,因為C語言使用的算數移位
14             //因為1-4位剛剛存儲了新加入到字符,所以不能>>28
15             hash ^= (x >> 24);
16             //上面這行代碼并不會對X有影響,本身X和hash的高4位相同,下面這行代碼&~即對28-31(高4位)位清零。
17             hash &= ~x;
18         }
19     }
20     //返回一個符號位為0的數,即丟棄最高位,以免函數外產生影響。(我們可以考慮,如果只有字符,符號位不可能為負)
21     return (hash & 0x7FFFFFFF);
22 }

然后用一個例題實踐一下吧吧,hdu1800

#include <bits/stdc++.h>
using namespace std;typedef unsigned int ui;
const int N = 7003, MOD = 7003;
int Hash[N], num[N];
int res;
int ELFhash(char *str)//思想就是一直雜糅,使字符之間互相影響
{ui h = 0, g;while(*str){h = (h<<4) + *str++; //h左移4位,當前字符占8位,加到h中進行雜糅if((g = h & 0xf0000000) != 0) //取h最左四位的值,若均為0,則括號中執行與否沒區別,故不執行{h ^= g>>24; //用h的最左四位的值對h的右起5~8進行雜糅h &= ~g;//清空h的最左四位}}return h; //因為每次都清空了最左四位,最后結果最多也就是28位二進制整數,不會超int
}
void hash_table(char *str)
{int k = ELFhash(str);int t = k % MOD;while(Hash[t] != k && Hash[t] != -1) t = (t + 1) % MOD;//開放地址法處理hashif(Hash[t] == -1) num[t] = 1, Hash[t] = k;else res = max(res, ++num[t]);
}
int main()
{int n;char str[100];while(~ scanf("%d", &n)){getchar();res = 1;memset(Hash, -1, sizeof Hash);for(int i = 1; i <= n; i++){scanf("%s", str);int j = 0;while(str[j] == '0') j++;hash_table(str + j);}printf("%d\n", res);}return 0;
}

轉載于:https://www.cnblogs.com/ilovetheworld/p/10110061.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android面試詳解

前臺就是和用戶交互的進程 可見進程例如一個activity被一個透明的對話框覆蓋&#xff0c;該activity就是可見進程 服務&#xff1a;service進程 后臺一個activity按了home按鍵就是從前臺退回到后臺 標準模式&#xff1a;不管任務棧是否存在相同的activity都會創建一個新的activ…

element-ui Notification重疊問題,原因及解決辦法

在1個方法中調用兩次this.$notify方法&#xff0c;會出現通知框重疊的問題 methods: {checkLogin: function () {if (this.username ) {this.$notify({title: 提示,message: 請輸入用戶名})}if (this.password ) {this.$notify({title: 提示,message: 請輸入用戶密碼})}}}網上…

Visual Stiudio使用技巧

技巧1 自動生成帶參構造函數當我們在編寫代碼時會經常遇到初始化一個的類&#xff0c;需要通過構造函數進行對象初始化。那么這個時候我們可能會需要逐個去手動寫&#xff0c;這樣的工作即重復又無趣。如果是在項目非常緊急的情況下還有大量的字段需要與入參一一對應起來簡直太…

js將時間戳格式化為HH:ii:ss的格式

將時間戳格式化為 HH:ii:ss的格式 <html> <head> </head> <body><span id"time"></span><script>var timestamp Date.parse(new Date())/1000;var time_old Date.parse(new Date())/1000;timeAdd()/*** purpose : …

Struts 整合 SpringMVC

Struts 整合 SpringMVC 過程&#xff1a;這篇文章是我在整合過程中所做的記錄和筆記 web.xml &#xff1a;篩選器機制過濾 原機制是攔截了所有 url &#xff0c;即 <url-pattern>/*</url-pattern>新機制為了將 structs2 的 url 與 SpringMVC 的 url 區分開來&#…

Vue保持用戶登錄及權限控制

vue-router-power-demo 核心內容有兩點&#xff1a; 一是保持用戶登錄狀態&#xff0c;二是根據登錄用戶的角色動態掛在路由 使用vuex保持用戶登錄 點擊登錄按鈕&#xff0c;使用vuex的actions分發登錄操作&#xff0c;發送用戶名和密碼到后臺獲取登錄token&#xff0c; 并存…

java B2B2C Springcloud多租戶電子商城系統-Spring Cloud Sleuth

在微服務框架中&#xff0c;一個由客戶端發起的請求在后端系統中會經過多個不同的的服務節點調用來協同產生最后的請求結果&#xff0c;每一個前段請求都會形成一條復雜的分布式服務調用鏈路&#xff0c;鏈路中的任何一環出現高延時或錯誤都會引起整個請求最后的失敗。 愿意了解…

C#性能測試BenchmarkDotnet

1.簡介在我們開發高性能代碼時&#xff0c;需要各種針對性能優化進行編碼。那么如何才能知道我們所加的代碼是否有性能方面的正向優化呢&#xff1f;有了BenchmarkDotNet&#xff0c;做性能對比測試就非常容易了&#xff0c;只需要把你的測試方法加上特性[Benchmark], 想做不同…

Requests獲取連接的IP地址

在接口自動化的時候&#xff0c;需要獲取到連接的本地IP地址&#xff0c;方法如下 1 import requests 2 3 rsp requests.get("http://www.baidu.com", streamTrue) 4 print rsp.raw._connection.sock.getpeername()[0] 5 print rsp.raw._connection.sock.getsockna…

阿里云APP(V4.3) SSH遠程登錄功能設置操作指南

阿里云APP V4.3 發布了&#xff0c;這次的升級&#xff0c;不僅在iOS和android平臺上支持SSH遠程登錄ECS功能&#xff0c;也支持密鑰登錄哦~~~ SSH遠程登錄&#xff0c;這是一個連阿里巴巴自己的技術人員都開心不已的功能&#xff01; 各位攻城獅們&#xff0c;從更新到V4.3的那…

JS專題之節流函數

本文共 2000 字&#xff0c;讀完只需 8 分鐘上一篇文章講了去抖函數&#xff0c;然后這一篇講同樣為了優化性能&#xff0c;降低事件處理頻率的節流函數。 一、什么是節流&#xff1f; 節流函數&#xff08;throttle&#xff09;就是讓事件處理函數&#xff08;handler&#xf…

vue 2.6 插槽v-slot用法記錄

v-slot用法簡記用法示例匿名插槽與具名插槽插槽作用域組件使用插槽動態命名總結用法示例 vue2.6統一了插槽的語法v-slot 匿名插槽與具名插槽 在其他組件中使用child組件 <child><template v-slot:slotName>hello world</template> </child>child組…

Latex排版全解(轉)

Latex排版全解 http://blog.csdn.net/langb2014/article/details/51354238轉載于:https://www.cnblogs.com/yifdu25/p/8338399.html

git-ftp Can't access remote 'ft://...', exiting...問題記錄

環境 服務器&#xff1a;西部數碼虛擬主機 本地系統&#xff1a;windows 10 (LTSC 2019) 軟件&#xff1a; Git Bash&#xff0c;gti-ftp (版本1.6.0) 問題 在使用git ftp init初始化上傳代碼的時候會出現 $ git ftp init fatal: Cant access remote ftp://dmkt:***dmkt.goto…

【Flutter教程】從零構建電商應用(一)

在這個系列中&#xff0c;我們將學習如何使用google的移動開發框架flutter創建一個電商應用。本文是flutter框架系列教程的第一部分&#xff0c;將學習如何安裝Flutter開發環境并創建第一個Flutter應用&#xff0c;并學習Flutter應用開發中的核心概念&#xff0c;例如widget、狀…

為OWA自定義快捷鍵

這篇短文分享一下如何為自己常用的網頁添加自定義功能&#xff0c;例如添加快捷鍵。我這里用一個常用的網站作為范例。它是Outlook Web Access (OWA), 它的地址一般如下。我在寫郵件時希望能用一些快捷鍵來提高工作效率&#xff0c;但系統默認自帶的快捷鍵特別少&#xff0c;而…

數據結構 快速排序

快速排序是對冒泡排序的一種改進&#xff0c;是所有內部排序算法中平均性能最優的排序算法。其基本思想是基于分治法的&#xff1a;在待排序數組L[1...n]中任取一個元素pivot作為基準&#xff0c;從數組的兩端開始掃描。設兩個指示標志&#xff08;low指向起始位置&#xff0c;…

Finally語句塊的運行

一、finally語句塊是否一定運行&#xff1f; Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被運行&#xff1f;非常多人都說不是。當然他們的回答是正確的&#xff0c;經過試驗。至少下面有兩種情況下finally語句是不會被運行的&#xff1a; &#xf…

vue-cli 3.0 跨域請求代理

官方文檔中指明&#xff0c;跨域請求可以通過配置vue.config.js中的devServer.proxy選項來進行配置。 這個選項配置的本質實際上就是http-proxy-middleware中間件的用法&#xff0c;和Webpack-dev-server的proxy一樣。 vue-cli 3.0中介紹了兩種常見的用法&#xff1a; modul…

小米人員架構調整:組建中國區,王川任總裁

12月13日上午&#xff0c;小米內部發布人員調整公開信&#xff0c;信中傳達了兩個重要內容&#xff1a;將銷售與服務部改組為中國區&#xff0c;任命集團高級副總裁王川兼任中國區總裁。 在今年9月份&#xff0c;也就是小米上市前夕&#xff0c;雷軍在一封內部信中宣布對公司組…