algorithm - 复杂度为 O(N) 的字符串的哈希函数

标签 algorithm hash computer-science hashcode

例如我们有一个字符串:“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/

相关文章:

c# - 将网格转换为图表以进行导航

algorithm - 鸡/蛋问题 : Hash of file (including hash) inside file! 可能吗?

javascript - 变量声明是否与变量的绑定(bind)相同?

arrays - 数组和散列映射在访问时如何保持恒定时间?

java - 帮助使用 Java 解决 D&D 迷宫

swift - 我应该更喜欢运算符重载而不是函数/方法吗?

algorithm - 检查一个简单的无向图是否是三连通的

java - 使用带有填充和 block 密码模式的哈希

javascript - hashchange 函数的异常 - 浏览器历史记录回来了吗?

floating-point - 如何将分数转换为 float ?