cityhash–對字符串的哈希算法

原文地址:cityhash–對字符串的哈希算法 – 無敵牛

歡迎參觀我的個人博客:無敵牛 – 技術/著作/典籍/分享等

分享一個給字符串計算hash的開源庫,谷歌出品。

源代碼在:https://github.com/google/cityhash

可以自己下載:git clone?https://github.com/google/cityhash.git

但是代碼是C++的,編譯出來的動態庫不能在C語言中調用,需要稍做修改后,才能編譯出來C語言的動態鏈接庫

可以按照下邊 1.1節 的方式修改,也可以直接下載修改完的代碼包。

cityhash.tar下載

用?tar -zxvf cityhash.tar.gz?的方式解壓,然后從 1.2節 開始操作就可以。

編譯安裝

1.1 修改,使支持C語言調用

只需要修改 src/city.h 文件即可。找到需要在C語言調用的函數,在其前后增加 extern “C” { …. }。修改后的文件如下:

#ifndef CITY_HASH_H_
#define CITY_HASH_H_#include <stdlib.h>  // for size_t.
#include <stdint.h>
#include <utility>typedef uint8_t uint8;
typedef uint32_t uint32;
typedef uint64_t uint64;
typedef std::pair<uint64, uint64> uint128;inline uint64 Uint128Low64(const uint128& x) { return x.first; }
inline uint64 Uint128High64(const uint128& x) { return x.second; }#ifdef __cplusplus
extern "C" {
#endif// Hash function for a byte array.
uint64 CityHash64(const char *buf, size_t len);// Hash function for a byte array.  For convenience, a 64-bit seed is also
// hashed into the result.
uint64 CityHash64WithSeed(const char *buf, size_t len, uint64 seed);// Hash function for a byte array.  For convenience, two seeds are also
// hashed into the result.
uint64 CityHash64WithSeeds(const char *buf, size_t len,uint64 seed0, uint64 seed1);// Hash function for a byte array.
uint128 CityHash128(const char *s, size_t len);// Hash function for a byte array.  For convenience, a 128-bit seed is also
// hashed into the result.
uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed);// Hash function for a byte array.  Most useful in 32-bit binaries.
uint32 CityHash32(const char *buf, size_t len);#ifdef __cplusplus
}    // extern "C"
#endif// Hash 128 input bits down to 64 bits of output.
// This is intended to be a reasonably good hash function.
inline uint64 Hash128to64(const uint128& x) {// Murmur-inspired hashing.const uint64 kMul = 0x9ddfea08eb382d69ULL;uint64 a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul;a ^= (a >> 47);uint64 b = (Uint128High64(x) ^ a) * kMul;b ^= (b >> 47);b *= kMul;return b;
}#endif  // CITY_HASH_H_

1.2 編譯和安裝

查看CPU是否支持 sse4_2 指令

生成 Makefile 文件,命令:./configure --enable-sse4.2?。

如果cpu不支持 sse4_2 指令,可以不加參數?--enable-sse4.2?。

編譯,命令:make all check CXXFLAGS="-g -O3 -msse4.2"?。

如果cpu不支持 sse4_2 指令,可以不加參數?-msse4.2

安裝,命令:make install?動態庫會安裝在 /usr/local/lib/ 目錄,頭文件在 /usr/local/include/ 目錄。

1.3 增加C語言可引入的頭文件

在 /usr/local/include/ 目錄下創建 cityhash.h 文件。內容如下:

#ifndef __CITY_HASH_C_H_
#define __CITY_HASH_C_H_#include <stdint.h>typedef uint8_t uint8;
typedef uint32_t uint32;
typedef uint64_t uint64;
typedef struct { uint64_t val[2] ; } uint128;// Hash function for a byte array.
uint64 CityHash64(const char *buf, size_t len);// Hash function for a byte array.  For convenience, a 64-bit seed is also
// hashed into the result.
uint64 CityHash64WithSeed(const char *buf, size_t len, uint64 seed);// Hash function for a byte array.  For convenience, two seeds are also
// hashed into the result.
uint64 CityHash64WithSeeds(const char *buf, size_t len,uint64 seed0, uint64 seed1);// Hash function for a byte array.
uint128 CityHash128(const char *s, size_t len);// Hash function for a byte array.  For convenience, a 128-bit seed is also
// hashed into the result.
uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed);// Hash function for a byte array.  Most useful in 32-bit binaries.
uint32 CityHash32(const char *buf, size_t len);#endif  //__CITY_HASH_C_H_ 

測試

2.1 創建測試文件 testch.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include "cityhash.h"int test(char * data) ;int main(int argc, char * argv[]){char * data = "aaaaaaaaaaaaaaabbbbbbbbbbbbccccccccccccdddddddddddddeeeeeeeeeeeffffffffffgggggggghhhhhhh" ;test(data) ;char * data2 = "aaaaaaaaaaaaaaabbbbbbbbbbbbccccccccccccdddddddddddddeeeeeeeeeeeffffffffffgggggggghhhhhhh3333" ;test(data2) ;return 0 ;
}int test(char * data) {uint32 key32 = CityHash32(data, strlen(data) ) ;printf("key32 [%u]\n", key32) ;uint64 key64 = CityHash64(data, strlen(data) ) ;printf("key64 [%lu]\n", key64) ;key64 = CityHash64WithSeed(data, strlen(data), 123123123 ) ;printf("key64 [%lu]\n", key64) ;key64 = CityHash64WithSeeds(data, strlen(data), 123123123, 321321321212121) ;printf("key64 [%lu]\n", key64) ;uint128 key128 = CityHash128(data, strlen(data) ) ;printf("key128 [%lu] [%lu]\n", key128.val[0], key128.val[1]) ;uint128 seed ;seed.val[0] = 123123123123 ;seed.val[1] = 33344455556666 ;key128 = CityHash128WithSeed(data, strlen(data),  seed) ;printf("key128 [%lu] [%lu]\n", key128.val[0], key128.val[1]) ;return 0 ;
}

2.2 編譯并運行測試程序

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

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

相關文章

spring cloud微服務分布式架構

spring cloud微服務分布式架構 應用架構 單體應用架構&#xff1a;all in one 如&#xff1a;前端后端部署在一臺服務器中 web應用和數據庫放在同一臺服務器中&#xff0c;只要服務器掛掉&#xff0c;應用就會終止。 分布式架構&#xff1a;將一個系統拆分為多個獨立的組件&…

【HarmonyOS】鴻蒙應用點9圖的處理(draw9patch)

【HarmonyOS】鴻蒙應用點9圖的處理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鴻蒙中是不支持安卓 .9圖的圖片直接使用。只有類似拉伸的處理方案&#xff0c;鴻蒙提供的Image組件有與點九圖相同功能的API設置。 可以通過設置resizable屬性來設置Resiza…

深入Android架構(從線程到AIDL)_12 Android UI 單線程程序

目錄 6、 Android UI 單線程程序 單線程程序概念 單線程可避免線程安全問題 SurfaceView與非UI線程 6、 Android UI 單線程程序 單線程程序概念 單線程程序意謂著兩個(或多個)線程不能共享對象或變量值。Android的UI是單線程程序的環境。UI控件(如Button等)都是由UI線程所…

STM32-筆記36-ADC(模擬/數字轉換器)

一、什么是ADC&#xff1f; 全稱&#xff1a;Analog-to-Digital Converter&#xff0c;指模擬/數字轉換器。 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁。 12 位 ADC 是一種逐次逼近型模擬數字轉換器&#xff08;0…

房產銷售系統(源碼+數據庫+文檔)

親測完美運行帶論文&#xff1a;文末獲取源碼 文章目錄 項目簡介&#xff08;論文摘要&#xff09;運行視頻包含的文件列表&#xff08;含論文&#xff09;前端運行截圖后端運行截圖 項目簡介&#xff08;論文摘要&#xff09; 隨著科學技術的飛速發展&#xff0c;各行各業都在…

游戲社交趨勢下,游戲語音再升級!

如今&#xff0c;游戲已成為我們社交生活的一個重要娛樂方式&#xff0c;春節臨近&#xff0c;與親朋好友一起暢玩“開黑”無疑是節假日的一大樂趣。在游戲社交互動中&#xff0c;“游戲語音”不可或缺。在傳統游戲語音領域&#xff0c;多人在線游戲如 MOBA、FPS 和 MMORPG 的實…

HTML5實現好看的博客網站、通用大作業網頁模板源碼

HTML5實現好看的博客網站、通用大作業網頁模板源碼 前言一、設計來源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源碼2.1 動態效果2.2 源代碼 源碼下載結束語 HTML5實現好看的博客網站、通用大作業網頁模板源碼&#xff0c;博客網站源碼&#xff0c;HTML模板源碼&#xff0…

ArcGIS中怎么把數據提取到指定范圍(裁剪、掩膜提取)

最近&#xff0c;經常能收到怎么把數據提取到指定范圍、柵格數據怎么裁剪、矢量數據怎么裁剪、柵格數據怎么掩膜提取的咨詢。 下面是我對這個問題的解決思路&#xff1a; 對于矢量數據&#xff1a; ①首先把數據加載進來 ②軟件界面上面的工具欄找到→地理處理→裁剪&#x…

PHP 使用集合 處理復雜數據 提升開發效率

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…

(轉)rabbitmq怎么保證消息不丟失?

RabbitMQ 可以通過以下多種機制來保證消息不丟失&#xff1a; 生產階段 - 持久化隊列和交換器&#xff1a; - 在聲明隊列和交換器時&#xff0c;將 durable 參數設置為 true &#xff0c;確保它們是持久化的。這樣&#xff0c;即使 RabbitMQ 節點重新啟動&#xff0c;隊列和交…

node.js內置模塊之---stream 模塊

stream 模塊的作用 在 Node.js 中&#xff0c;stream 模塊是一個用于處理流&#xff08;stream&#xff09;的核心模塊。流是一種處理數據的抽象方式&#xff0c;允許程序處理大量數據時不會一次性將所有數據加載到內存中&#xff0c;從而提高性能和內存效率。通過流&#xff0…

手持PDA終端,提升零售門店管理效率

隨著科技的不斷進步和零售行業的持續發展&#xff0c;手持PDA終端的應用將會越來越廣泛。它將不斷融合更多先進的技術和功能&#xff0c;為零售門店管理帶來更加便捷、高效、智能的解決方案。 手持PDA終端是集成了數據處理、條碼掃描、無線通信等多種功能于一體的便攜式設備?…

LeetCode -Hot100 - 53. 最大子數組和

前言 本專欄主要通過“LeetCode 熱題100”&#xff0c;來撿起自己本科階段的算法知識與技巧。語言主要使用c/java。如果同樣正在練習LeetCode 熱題100的朋友歡迎關注或訂閱本專欄。有疑問歡迎留言交流~ 題目描述 題目鏈接 示例 1&#xff1a; 輸入&#xff1a;nums [-2,1…

【51單片機-零基礎chapter1】

安裝軟件(配套的有,不多贅述) 1.管理員身份運行keil和破解軟件kegen 將CID代碼復制粘貼到 一定要管理員方式,不然會error 插入板子 我的電腦,管理 1.如果是拯救者,查看端口,如果沒有則顯示隱藏 2.蘋果不知道,好像不可以 3.其他電腦在"其他設備找" (注:本人在校已…

Go語言的 的設計模式(Design Patterns)基礎知識

Go語言的設計模式基礎知識 引言 設計模式是一種在軟件開發中經常使用的解決特定問題的通用方案。它們為開發者提供了一種有效的方式來組織代碼、提高代碼的可復用性、可維護性和靈活性。在眾多編程語言中&#xff0c;Go語言因其獨特的特性&#xff0c;如并發支持和簡潔的語法…

使用JMeter玩轉tidb壓測

作者&#xff1a; du拉松 原文來源&#xff1a; https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql協議的&#xff0c;所以在使用過程中使用tidb的相關工具連接即可。因為jmeter是java開發的相關工具&#xff0c;直接使用mysql的jdbc驅動包即可。 二、linux下安裝jmet…

C# 設計模式(結構型模式):外觀模式

C# 設計模式&#xff08;結構型模式&#xff09;&#xff1a;外觀模式 (Facade Pattern) 在復雜系統中&#xff0c;往往會涉及到多個子系統、模塊和類。這些子系統的接口和功能可能會讓使用者感到困惑和復雜。在這種情況下&#xff0c;我們可以使用外觀模式&#xff08;Facade…

計算機網絡常見面試題及解答

以下是計算機網絡中常見的面試題及解答&#xff0c;按主題分類&#xff1a; --- ## **一、基礎概念** ### **1. OSI 七層模型和 TCP/IP 模型的區別是什么&#xff1f;** **答&#xff1a;** - **OSI 七層模型&#xff1a;** - 應用層、表示層、會話層、傳輸層、網絡層、數…

Win11+WLS Ubuntu 鴻蒙開發環境搭建(一)

參考文章 Windows11安裝linux子系統 WSL子系統遷移、備份與導入全攻略 如何擴展 WSL 2 虛擬硬盤的大小 Win10安裝的WSL子系統占用磁盤空間過大如何釋放 《Ubuntu — 調整文件系統大小命令resize2fs》 penHarmony南向開發筆記&#xff08;一&#xff09;開發環境搭建 一&a…

微信小程序提示 miniprogram-recycle-view 引入失敗

npm i --save miniprogram-recycle-view 安裝需要使用的頁面的json文件中配置 {"usingComponents": {"recycle-view": "miniprogram-recycle-view/recycle-view","recycle-item": "miniprogram-recycle-view/recycle-item"…