【发布时间】:2016-12-10 19:32:24
【问题描述】:
假设哈希整数永远不会溢出,以下生成的哈希对于不同的键是否总是不同的? 密钥应该包含 ascii 编码的字符。
我认为是这样,因为我想不出一个例外情况。
char[] arr = "abcd"
int hash = 0
for (int i=0; i<arr.size; i++) {
hash += (i+1) * arr[i]
}
EDIT1:虽然以下是对我最初问题的技术正确答案,但我应该提到密钥的域是有效电子邮件 ID 的域。因此,不包括一些 ascii 字符。不过,我会进行一些测试并报告。唯一的问题是枚举所有烫发只能达到很小的长度。
无论如何,我的要求是根据电子邮件 ID 创建唯一 ID,并将它们用作数据库中的主键。只是不想自己使用邮件ID。
EDIT2: 好吧,显然有很多碰撞。例如,03N@gmail.com 的哈希 == 00P@gmail.com 的哈希
...
040 == 012
041 == 013
042 == 014
043 == 015
044 == 016
045 == 017
046 == 018
047 == 019
048 == 01:
...
我需要一个不同的散列算法。可以推荐吗?
【问题讨论】:
-
"对于不同的键,以下生成的哈希是否总是不同的?"根据“散列函数”的定义,答案是“否”。如果答案是“是”——不要称它为哈希函数。
-
您正在占用较大的值空间并将其“压缩”到较小的空间。根据定义,至少有 2 个输入值映射到相同的输出。
-
应该至少有一次碰撞
标签: hash unique hash-function