Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

    • 01分数规划学习笔记
    • CDQ分治学习笔记
    • wqs二分学习笔记
    • 一两句话小技巧
    • 单调性应用学习笔记
    • 哈希函数(Hash)函数的设计
      • FNV-1a
    • 带权并查集处理线段
    • 环检测算法学习笔记
    • 约瑟夫环学习笔记
    • 组合情况
    • 高效位运算

哈希函数(Hash)函数的设计

# 前言

为了程序的高效运行,合理的Hash函数设计至关重要

# Subdiffusions

常用的方法有很多,例如bitwise subdiffusions

d(x)=σ(x)⊕md(x)=\sigma(x)\oplus m d(x)=σ(x)⊕m

其中,σ(x)\sigma(x)σ(x)代表xxx的二进制排列

dependent bitwise subdiffusions

d(x)=σ(x)⊕xd(x)=\sigma(x)\oplus x d(x)=σ(x)⊕x

d(x)=(x≪m)⊕xd(x)=(x\ll m) \oplus x d(x)=(x≪m)⊕x

linear subdiffusions

d(x)≡ax+c(modm),gcd⁡(x,m)=1d(x) \equiv ax + c \pmod m, \quad \gcd(x, m) = 1 d(x)≡ax+c(modm),gcd(x,m)=1

arithmetic subdiffusions

d(x)=x⊕(x+c)d(x) = x \oplus (x + c) d(x)=x⊕(x+c)

# Diffusions

通过多个Subdiffusions的组合,可以得到一个比较好的Diffusions。

但仍需要注意的是,得到的Diffusions应当对为0的输入有反应:例如,对集合{3,0}\{3,0\}{3,0}与集合{3}\{3\}{3}分别哈希,得到的hash值应当不同

# 常用算法

# FNV-1a

# 32位
hash = 2166136261
mod = pow(2, 31)
for value in values:
    hash = hash ^ value
    hash = hash * 16777619 % mod

# 64位
hash = 14695981039346656037
mod = pow(2, 63)
for value in values:
    hash = hash ^ value
    hash = hash * 1099511628211 % mod
1
2
3
4
5
6
7
8
9
10
11
12
13

# 参考

http://ticki.github.io/blog/designing-a-good-non-cryptographic-hash-function/

wiki (opens new window)

上次更新: 2021/02/24, 03:37:30
单调性应用学习笔记
带权并查集处理线段

← 单调性应用学习笔记 带权并查集处理线段→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式