USI中,Hash的作用是什么?
在笔出墨之前,USI controller需要得到笔的一系列信息,例如颜色、宽度、压力、倾角信息等等,才允许出墨。
为了加快出墨的速度,USI controller内置一个information cache,存储已经配对过的笔的信息,然后,controller将这些信息计算得到一个code,code是比较短的,笔也将自己的信息计算得到一个code,controller会用get hash包去得到笔的code,通过比较controller的code和笔的code是否一致,就可以得知这根笔的信息是不是已经存在controller的cache里面了,如果已经存了,就可以跳过配对操作,加快出墨的速度。
根据上诉描述,这个编码需要满足几个条件:
- 对于任意输入信息,输出编码长度最好是固定的且较短
- 实现要尽量简单
- 计算速度尽量快,效率要高
- 一对一映射, 相同输入要有相同的输出,不同的输入要有不同的输出编码
为了满足上诉条件,Hash code是比较合适的。
哈希是什么?它的数学原理是什么?
哈希码(Hash code)是将任意长度的输入数据映射成固定长度的输出字符串的过程。这个输出字符串通常被称为哈希值或摘要。哈希码的目的是为了唯一地标识输入数据,而且即使输入数据的微小变化也应该导致哈希值的显著变化。
主要特点包括:
固定长度输出: 无论输入数据有多长,哈希函数都会生成一个固定长度的哈希码。
相同输入产生相同输出: 对于相同的输入,哈希函数始终会生成相同的哈希码。
不可逆性: 通常,从哈希码推导出原始输入的过程是不可逆的。即使微小的输入变化,哈希码也应该是完全不同的。
碰撞: 哈希函数可能会产生不同的输入映射到相同的哈希码,这被称为碰撞。好的哈希函数设计会尽量减小碰撞的概率。
哈希码在计算机科学和密码学中有许多应用,包括密码存储、数据完整性验证、数据结构的快速查找等。常见的哈希算法包括MD5(已不安全)、SHA-1(已不安全)、SHA-256等。在安全敏感的应用中,更强大的哈希算法通常更受青睐,因为它们更难以被暴力破解。
哈希算法的数学计算包括乘法、加法、取模(取余数)等操作的混合运算,几种计算结合以实现算法的目的,具体的算法设计原理请自行搜索相关论文和文献。
MurmurHash3的特点是什么?实现方式是什么?
USI选用的Hash算法是MurmurHash3,32位的版本。
MurmurHash3是一种非常快速、高效的非加密哈希函数,由Austin Appleby于2008年设计。它是MurmurHash哈希系列的第三个版本。MurmurHash3被广泛用于各种应用中,包括散列表、分布式存储、网络协议等。
MurmurHash3有几个不同的变体,包括32位和128位版本,分别生成32位和128位的哈希值。最常用的是32位版本,它在性能和均匀性方面都表现良好。
MurmurHash3的特点包括:
速度快: MurmurHash3是为了追求高速性能而设计的,适用于对速度有较高要求的应用。
低碰撞率: MurmurHash3在设计上考虑了尽量减小碰撞的概率,使得不同的输入在哈希后的分布尽量均匀。
简单: MurmurHash3相对简单,易于实现和使用。
以下是一个简化的MurmurHash3 32位版本的示例(使用伪代码表示):
function MurmurHash3_32(key, seed):
c1 = 0xcc9e2d51
c2 = 0x1b873593
r1 = 15
r2 = 13
m = 5
n = 0xe6546b64
hash = seed
for each 4-byte chunk of key:
k = get_next_chunk(key)
k *= c1
k = (k << r1) | (k >> (32 - r1))
k *= c2
hash ^= k
hash = ((hash << r2) | (hash >> (32 - r2))) * m + n
return hash
请注意,由于MurmurHash3是非加密哈希函数,不适用于对安全性要求很高的场景。
CRC算法和Hash的异同点
CRC(Cyclic Redundancy Check)和哈希函数都是用于数据校验的技术,但它们有一些关键的异同点。
共同点:
数据校验: CRC 和哈希函数都用于检测数据是否在传输或存储中发生了错误。它们的主要目标是确保数据的完整性。
不可逆性: 在典型的使用场景中,它们都是不可逆的,即无法从校验值还原出原始数据。
数据压缩:都可以从任意长度的数据生成一个固定长度的数据。
不同点:
设计目标:
CRC: CRC 主要用于检测传输或存储介质中的错误。它是一种线性的校验方法,主要关注于检测是否存在误码,而不关心误码的位置或形式。
哈希函数: 哈希函数旨在将数据映射到固定长度的哈希码,用于唯一标识数据或进行快速数据检索。它是一种非线性的方法,通常用于生成数据的唯一标识符。
生成机制:
CRC: CRC 使用多项式除法来生成校验值,将余数附加到原始数据上。生成的校验值与数据的位相关。
哈希函数: 哈希函数使用复杂的算法,经过多轮的运算将任意长度的输入映射到一个固定长度的输出。生成的哈希码与整个输入数据相关。
应用领域:
CRC: 主要用于通信协议、存储介质等领域,以检测数据传输中的错误。
哈希函数: 主要用于数据完整性验证、密码学、数据结构中的快速查找等领域。
碰撞处理:
CRC: CRC 主要关注错误的检测,而不是处理碰撞。在 CRC 中,不同的输入可能产生相同的余数,但这通常不是主要关注点。
哈希函数: 哈希函数通常需要处理碰撞的可能性,即不同的输入产生相同的哈希码。好的哈希函数设计会尽量减小碰撞的概率。
总体而言,CRC 和哈希函数是两种不同的技术,适用于不同的场景和目标。选择使用哪种技术取决于具体的需求和应用情境。