RocksDB 解密可逆哈希:BijectiveHash的設計奧秘

BijectiveHash(雙射哈希,即可逆哈希)的設計精髓在于它借鑒了現代密碼學和高性能哈希函數中的核心思想,但目標并非加密,而是實現一種無沖突、可逆的置換(Permutation)

可逆哈希是什么,用來做什么?

首先要明確,它和我們通常說的用于哈希表或數據校驗的哈希函數(如?Hash64)完全不同。

  • 普通哈希:是多對一的,輸入空間遠大于輸出空間,必然存在沖突(多個不同輸入產生相同輸出),并且是單向的(不可逆)。
  • 可逆哈希:是一對一的,輸入和輸出空間大小相同,絕無沖突,并且是雙向的(可逆的)。

它的主要用途是數據混淆(Obfuscation)ID置換。比如,你有一組從0開始連續的ID(0, 1, 2, ...),但你不想直接暴露它們,希望把它們變成一組看起來毫無規律、隨機分布的ID,同時還能在需要時恢復成原始ID。這時可逆哈希就派上用場了。

BijectiveHash2x64?設計精髓分析

這個函數的設計巧妙地改編自?XXH3?哈希算法中處理小數據塊的部分。XXH3為了達到雪崩效應,混合極其充分,而BijectiveHash則利用了這種充分混合的特性,并確保每一步操作都是可逆的。

我們來看它的核心代碼:

hash.cc

// ... existing code ...
void BijectiveHash2x64(uint64_t in_high64, uint64_t in_low64, uint64_t seed,uint64_t* out_high64, uint64_t* out_low64) {// Adapted from XXH3_len_9to16_128bconst uint64_t bitflipl = /*secret part*/ 0x59973f0033362349U - seed;const uint64_t bitfliph = /*secret part*/ 0xc202797692d63d58U + seed;Unsigned128 tmp128 =Multiply64to128(in_low64 ^ in_high64 ^ bitflipl, 0x9E3779B185EBCA87U);uint64_t lo = Lower64of128(tmp128);uint64_t hi = Upper64of128(tmp128);lo += 0x3c0000000000000U;  // (len - 1) << 54in_high64 ^= bitfliph;hi += in_high64 + (Lower32of64(in_high64) * uint64_t{0x85EBCA76});lo ^= EndianSwapValue(hi);tmp128 = Multiply64to128(lo, 0xC2B2AE3D27D4EB4FU);lo = Lower64of128(tmp128);hi = Upper64of128(tmp128) + (hi * 0xC2B2AE3D27D4EB4FU);*out_low64 = XXH3_avalanche(lo);*out_high64 = XXH3_avalanche(hi);
}
// ... existing code ...
設計精髓 1:保證無信息丟失的操作

要實現可逆,最關鍵的一點是任何操作都不能丟失信息

  • Multiply64to128:這是整個設計的核心。普通的64位乘法?uint64_t * uint64_t?的結果仍然是?uint64_t,這會丟失高64位的信息,導致不可逆。而?Multiply64to128?將兩個64位整數相乘,產生一個完整的128位結果(Unsigned128),完整保留了所有信息。這是可逆性的數學基礎。
  • XOR (^) 和加法 (+):這些操作本身就是可逆的。a ^ b?可以通過再異或一次?b?恢復?aa + b?可以通過減去?b?恢復?a
設計精髓 2:借鑒密碼學的“混淆”與“擴散”

為了讓輸出看起來隨機,它借鑒了密碼學中的兩個重要概念:

  • 混淆(Confusion):讓輸入和輸出之間的關系變得盡可能復雜。
    • 通過與seed相關的密鑰(bitflipl,?bitfliph)進行XOR操作。
    • 與大的素數(0x9E3779B185EBCA87U?等)相乘。
  • 擴散(Diffusion):讓輸入的任何一位微小變化都能影響到輸出的多位(雪崩效應)。
    • lo ^= EndianSwapValue(hi):這是一個類似Feistel網絡的結構。它用一部分數據(hi)去改變另一部分數據(lo),然后再用改變后的lo去影響hi的計算。這種交叉影響能迅速地將輸入的變化擴散到整個128位狀態中。
    • XXH3_avalanche:最后調用XXH3的雪崩函數,進行最終的、徹底的混合,確保最終輸出的隨機性。
設計精髓 3:可逆的雪崩函數

XXH3_avalanche?本身是一個單向函數,但設計者巧妙地為它實現了一個逆函數?XXH3_unavalanche

// ... existing code ...
inline uint64_t XXH3_avalanche(uint64_t h64) {h64 ^= h64 >> 37;h64 *= 0x165667919E3779F9U;h64 ^= h64 >> 32;return h64;
}inline uint64_t XXH3_unavalanche(uint64_t h64) {h64 ^= h64 >> 32;h64 *= 0x8da8ee41d6df849U;  // inverse of 0x165667919E3779F9Uh64 ^= h64 >> 37;return h64;
}
// ... existing code ...

這里的關鍵是?0x8da8ee41d6df849U,它是?0x165667919E3779F9U?在模?2^64?意義下的乘法逆元。這意味著?(a * b) * b_inverse = a (mod 2^64)。通過找到這個逆元,乘法步驟就變得可逆了。而XOR和移位操作的逆運算也相對直接。

BijectiveUnhash2x64:逆向工程的藝術

逆向函數?BijectiveUnhash2x64?的實現完美展示了如何一步步“撤銷”正向函數的操作。

// ... existing code ...
void BijectiveUnhash2x64(uint64_t in_high64, uint64_t in_low64, uint64_t seed,uint64_t* out_high64, uint64_t* out_low64) {// Inverted above (also consulting XXH3_len_9to16_128b)const uint64_t bitflipl = /*secret part*/ 0x59973f0033362349U - seed;const uint64_t bitfliph = /*secret part*/ 0xc202797692d63d58U + seed;uint64_t lo = XXH3_unavalanche(in_low64);uint64_t hi = XXH3_unavalanche(in_high64);// ... a series of inverse multiplications, subtractions, and XORs ...// ... in the exact reverse order of the forward function ...*out_high64 = hi;*out_low64 = lo;
}
// ... existing code ...

它的每一步都精確地對應?BijectiveHash2x64?的逆操作,并嚴格按照相反的順序執行:

  1. 先用?XXH3_unavalanche?撤銷雪崩混合。
  2. 用乘法逆元撤銷乘法。
  3. 用減法撤銷加法。
  4. 用XOR撤銷XOR。

總結:設計精髓

  1. 以無損操作為基石:使用擴展精度運算(如64->128位乘法)來確保計算過程不丟失任何信息,這是可逆性的前提。
  2. 借鑒密碼學思想:采用Feistel網絡、密鑰(seed)混淆、乘大素數等方式實現充分的混淆和擴散,讓輸出看起來隨機。
  3. 依賴數論工具:可逆性的實現嚴重依賴于數論,特別是模乘法逆元的計算,這是將單向乘法變為雙向的關鍵。
  4. 結構對稱:正向和逆向過程在結構上是完全對稱的,逆向過程是正向過程的完美“鏡像”。

通過學習這個設計,我們可以看到一個看似簡單的“可逆哈希”背后,融合了計算機體系結構(擴展精度乘法)、密碼學(混淆擴散)和數論(模逆元)的深刻原理,是高性能計算和算法設計的典范。

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

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

相關文章

05.用戶和組管理命令

用戶和組管理命令用戶和組管理命令1. getent2. useradd3. usermod4. userdel5. id6. su7. passwd8. chage9. groupadd10. groupmod11. groupdel12. gpasswd13. groupmems用戶和組管理命令 用戶和組的主要配置文件 /etc/passwd&#xff1a;用戶及其屬性信息(名稱、UID、主組ID…

go 多版本共存【goup + alias方案】

一、需求背景 以go1.21為主&#xff0c;臨時可以快速切換到go1.23,且只有當前窗口生效 二、安裝 安裝 goup go install github.com/owenthereal/goup/cmd/gouplatest安裝 go1.23 # 注意這里是安裝新的sdk,如果你本地存在相同版本的話&#xff0c;應該保持統一用goup安裝的 goup…

DR200差速移動機器人的多功能感知系統與多場景應用

DR200差速移動機器人平臺是一款基于室內平地的差速轉向移動機器人底盤&#xff0c;主要針對教育教學、超市移動促銷、無人配送、室內倉儲、室內巡檢、物流搬運等行業。整套底盤采用了4個萬向輪和雙驅動輪差速驅動結構&#xff0c;間驅動輪帶直流無刷伺服電機。整套結構采用了擺…

基于ZLMediaKit的大疆上云視頻流服務集成方案

引言 隨著無人機技術的快速發展&#xff0c;大疆&#xff08;DJI&#xff09;設備產生的高清視頻流需要高效、低延遲的云端處理方案。傳統基于SRS的視頻流服務在多協議支持和并發性能上存在局限&#xff0c;而ZLMediaKit作為一款高性能流媒體服務框架&#xff0c;憑借其多協議支…

用 Python 實現一個“小型 ReAct 智能體”:思維鏈 + 工具調用 + 環境交互

在大語言模型&#xff08;LLM&#xff09;的應用開發中&#xff0c;如何讓模型具備調用外部工具的能力是一個關鍵問題。我們不希望模型只是“生成答案”&#xff0c;而是能像一個智能體&#xff08;Agent&#xff09;一樣&#xff0c;按照推理鏈條自主決定調用搜索、計算、或數…

集成電路學習:什么是SIFT尺度不變特征變換

SIFT:尺度不變特征變換 SIFT(尺度不變特征變換,Scale Invariant Feature Transform)是一種在圖像處理和計算機視覺領域廣泛應用的算法,由David Lowe在1999年提出。該算法能夠在圖像的不同尺度、旋轉和光照條件下保持特征不變性,從而提取出獨特的特征點,并用于圖像…

短視頻流量|基于Java+vue的短視頻流量數據分析系統(源碼+數據庫+文檔)

短視頻流量數據分析系統 基于SprinBootvue的短視頻流量數據分析系統 一、前言 二、系統設計 三、系統功能設計 系統功能模塊 管理員功能模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff…

【無標題】卷軸屏手機前瞻:三星/京東方柔性屏耐久性測試進展

卷軸屏手機前瞻&#xff1a;三星/京東方柔性屏耐久性測試進展卷軸屏手機的產業化突破臨近2025年全球柔性屏市場規模預計突破186億美元&#xff0c;其中卷軸屏技術正從概念走向量產。三星顯示近期宣布新一代柔性OLED面板通過50萬次折疊認證&#xff0c;日均折疊200次可使用6年以…

Git 入門指南:核心概念與常用命令全解析

Git 入門指南&#xff1a;核心概念與常用命令全解析前言一、Git相關概念1.1 工作目錄1.2 暫存區1.3 本地倉庫1.3 遠程倉庫1.3.1 首次提交到遠程倉庫提示輸入用戶名密碼1.3.2 解決方法二、Git常用命令2.1 配置命令2.1.1 查看當前 Git 配置的所有信息2.1.2 查看系統全局配置2.1.3…

懸賞任務網站源碼多平臺兼職賺錢搭建圖解

功能詳細說明 &#xff08;一&#xff09;登錄與注冊 1、登錄&#xff1a;打開系統用戶端&#xff0c;輸入已注冊的手機號和密碼進行登錄。 若為忘記密碼&#xff0c;可通過 “找回密碼” 功能&#xff0c;按提示驗證身份后重置密碼登錄。 2、注冊&#xff1a;點擊 “注冊” 按…

Node.js簡介及安裝

一、Nodejs簡介 1、核心定義 Node.js 是一個基于 Chrome V8 引擎的開源、跨平臺 JavaScript 運行時環境&#xff08;Runtime&#xff09;&#xff0c;用于在服務器端或本地運行 JavaScript 代碼。它并非編程語言、庫或框架&#xff0c;而是擴展了 JavaScript 的能力&#xff0…

KINGBASE集群日常維護管理命令總結

查看集群的狀態 [kingbasenode1 bin]$ repmgr cluster show查看守護集群狀態 [kingbasenode1 bin]$ repmgr service status查看集群的事件 [kingbasenode1 etc]$ repmgr cluster event查看集群流復制狀態 esrep#select usename,application_name,client_addr,sync_state,state,…

GoLand 調參高手都在用的配置!續集:WebStorm 飛升后,Go 開發 IDE 性能炸裂的秘密

“為什么別人的 GoLand 運行 Go 項目絲滑流暢&#xff0c;而你的卻頻繁卡頓、編譯轉圈&#xff1f;秘密就藏在這個 goland64.exe.vmoptions文件里&#xff01;作為 IDEA/PyCharm/WebStorm 調優系列的續集&#xff0c;我把我壓箱底的 ?GoLand 性能調優參數表? 分享出來—>&…

48Days-Day19 | ISBN號,kotori和迷宮,矩陣最長遞增路徑

ISBN號 ISBN號碼_牛客題霸_牛客網 算法原理 模擬&#xff0c;根據題意模擬就可以了&#xff0c;注意一下余數為10的時候要特別判斷一下是不是X就行了 代碼 import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息 public class Main {public stat…

Java 泛型類型擦除

&#x1f4d6; 概述 本文檔詳細解釋了 Flink 中 TypeInformation 的作用、原理和使用方法&#xff0c;幫助理解為什么 Flink 需要顯式的類型信息。 &#x1f3af; 核心問題&#xff1a;Java 泛型類型擦除 什么是類型擦除&#xff1f; Java 在編譯時會將泛型信息擦除&#xff0c…

從“寫代碼”到“定義需求”:AI編程工具如何重構軟件開發的核心流程?

從“寫代碼”到“定義需求”&#xff1a;AI編程工具如何重構軟件開發的核心流程&#xff1f; 軟件開發的核心流程正在經歷一場靜默革命。十年前&#xff0c;開發者的日常被“寫代碼”填滿——從變量定義到邏輯實現&#xff0c;每行代碼都需要手動敲擊&#xff1b;而今天&#x…

一顆TTS語音芯片給產品增加智能語音播報能力

?一顆TTS語音芯片給產品增加智能語音播報能力傳統語音播報芯片可以設置一些固定的語音片段或者內容&#xff0c;但是對于現在各種創新產品層出不窮的時代&#xff0c;傳統的語音播報芯片能力似乎有點不夠用了。而TTS語音合成芯片&#xff0c;正在逐漸登上舞臺中央。TTS語音合成…

[免費]基于Python的影視數據可視化分析系統(Flask+echarts)【論文+源碼+SQL腳本】

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的基于Python的影視數據可視化分析系統(Flaskecharts)&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的愛奇藝影視電影數據可視化分析系統(Flaskecharts) Python畢業設計_嗶哩嗶哩_bilibili 系統…

Three.js 材質系統深度解析

簡介 Three.js 是一個功能強大的開源 3D 圖形庫&#xff0c;廣泛應用于 Web 端的 3D 可視化開發。其材質系統是 Three.js 的核心組成部分之一&#xff0c;負責定義 3D 對象的表面外觀和渲染效果。從簡單的顏色填充到復雜的動態效果&#xff0c;材質系統為開發者提供了高度靈活…

FP16(半精度)和FP32(單精度)

FP16&#xff08;Half-Precision Floating Point&#xff0c;半精度浮點數&#xff09;是一種使用16位二進制數表示浮點數值的數據格式&#xff0c;在深度學習、圖形渲染和高性能計算中廣泛應用。其核心定義、技術特性與應用價值如下&#xff1a;一、FP16的核心定義與結構二進制…