我正在尝试在python中实现murmur散列3。我对这个函数mmh3.hash_bytes(key)
有混淆。
下面是我尝试过的代码:
a = bitarray()
print(mmh3.hash('A')) # output is 1423767502 a hash value
接下来,我又尝试了一个函数
print(mmh3.hash_bytes('A'))
# output is b'z\xb1)\x9a\xb7\xc2_\x037\x99\xddF\x9c\xf2}8'
mmh3.hash_bytes('A')的输出使我感到困惑。这两个函数不应该具有相同的值吗?因为两个哈希值都是'A‘。如果我错了就纠正我。
发布于 2022-02-08 10:57:33
来自在线文件:
mmh3.hash("foo") # returns a 32-bit signed int
..。mmh3.hash_bytes("foo") # 128 bit value as bytes
维基百科说了同样的话:
目前的版本是MurmurHash3,它产生32位或128位的哈希值.
这在C++实现的头文件中也是显式的:
void MurmurHash3_x86_32 ( const void * key, Py_ssize_t len, uint32_t seed, void * out );
void MurmurHash3_x86_128 ( const void * key, Py_ssize_t len, uint32_t seed, void * out );
assert mmh3.hash("foo") == -156908512
..。assert mmh3.hash_bytes("foo") == b"aE\xf5\x01W\x86q\xe2\x87}\xba+\xe4\x87\xaf~"
因此,我承认,相同的散列函数返回两个不同的结果是令人惊讶的,但实际上它不是完全相同的散列函数。
发布于 2022-02-08 22:01:42
在现代密码学中,它们不同的原因很简单;域分离使得对MurmurHash (SHA2有它,SHA3派生也有它)的不同大小的调用将输出不同的值。这可能会防止在加密情况下的某些攻击(MurmurHash不是加密散列),或者帮助分散某些攻击中的表.
使用随机预言的密码协议经常被分析。 假设随机先知只回答问题 由协议产生的。实际上,这一假设并没有 如果两个协议查询相同的随机预言,则保持不变。具体而言, 考虑查询随机oracle的协议P1和P2 :如果P1和P2都在相同的值x上查询R,则对一个或 这两种协议都可能无效。 解决这一问题的一种通用方法称为域。 分离,它允许单个随机先知模拟多个独立的先知。这是通过确保每个 模拟甲骨文所看到的查询与 所有其他模拟的先知。例如,要模拟给定单个甲骨文R的两个先知R1和R2,一个可以定义 R1(x) := R("R1“= x) R2(x) := R("R2”= x) 在本例中,"R1“和"R2”称为域分离标记; 它们确保对R1和R2的查询不会导致相同的结果。 因此,将R1和R2视为独立的查询是安全的。 神谕。
如果我们查看来自维基百科的代码示例,我们将看到这一行;
hash ← hash XOR len
也就是说,所需的长度(len
)被合并到MurmurHash中,这样值就会改变,而不是简单地截断128位的输出。
https://stackoverflow.com/questions/71026560
复制相似问题