例如我们有一个字符串:“abc”。是否可以创建一个哈希函数(复杂度为 O(N),其中 N 是字符串长度),它将执行以下操作:对于字符串“abc”的所有排列,它将返回相同的结果。
例如:
hash("abc") returns SC0wA //just an example value, not a real hash key
hash("bac") returns SC0wA
...
hash("cba") returns SC0wA
但对于“bba”,它将是:
hash("bba") return GD1z
hash("bab") return GD1z
更新:
哈希函数对整个alhpabet不应该有任何冲突
最佳答案
一个简单的算法可以是:
int x = 0;
int s = 0;
for each character c in the string str
{
x = x ^ c
s = s + ASCII value of c
}
hash(str) = x + s
冲突处理
我在最终答案中添加值 s
的原因是因为假设我们有两个字符串 s1 = "ab"
和 s2 = "ef"
,它们只是通过异或
操作会导致冲突,但是我们将它们的ASCII值
相加后,它们不会导致冲突。
当字符的ASCII 值
之和相同时,xor
操作也有助于避免冲突。假设我们有 s1 = "ad"
和 s2 = "bc"
。如果只考虑 ASCII 值的和
,它会导致冲突,但在考虑 xor
操作后,它不会。
对于像 "aaaa"和 "bbbb"这样的偶数长度的字符串,如果我们只考虑 xor
操作,我们仍然会发生冲突,但是通过添加 ASCII 值
,我们可以避免碰撞。
所以结合字符串字符的ASCII值之和和异或运算,可以更大程度的处理碰撞。
关于algorithm - 复杂度为 O(N) 的字符串的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37986939/