好的,我需要一个散列函数来满足以下要求。我们的想法是能够将属于同一逻辑结构但存储在文件系统不同物理区域中的目录链接在一起。
我需要在Java中实现它,它必须在执行会话中保持一致,并且它可以返回很长的时间。
我将哈希目录名称/字符串。这应该有效,以便"somefolder1"
和"somefolder2"
将返回不同的哈希值,"JJK"
和"JJL"
也是如此。我也想知道何时可能发生冲突。
有什么建议吗?
由于
答案 0 :(得分:4)
好吧,几乎所有散列函数都具有输入中的微小变化会在输出中产生大的变化的属性,这意味着“somefolder1”和“somefolder2”将始终产生不同的散列。
至于冲突,只需看看哈希输出有多大。 Java自己的hashcode()
返回int
,因此您可以比使用MD5或SHA-1更频繁地发生冲突,例如分别产生128和160位。
不过,你不应该尝试从头开始创建这样的函数。
但是,我不太明白是否应该在您的用例中发生冲突,或者在罕见的情况下是否可以接受冲突。对于链接文件夹,我肯定会使用一个保密的唯一标识符,而不是可能出现多次的标识符。
答案 1 :(得分:2)
您还没有描述不同的字符串在什么情况下应该返回相同的哈希值。
一般来说,我会首先通过实现相等函数来设计散列函数。这应该显示您需要在哈希中包含哪些数据位,哪些应该被丢弃。如果两个不同数据位之间的相等是复杂的(例如不区分大小写),那么希望对于该特定比较将存在相应的散列函数。
无论你做什么,都不要认为相等的哈希意味着相等的密钥(即哈希是唯一的) - 这总是导致潜在问题的原因。
答案 2 :(得分:1)
Java的String哈希码将为您提供int
,如果您需要long
,您可以获取字符串的MD5总和的最低64位。
可能会发生冲突,您的系统必须为此做好准备。也许如果你更详细地说明哈希码将用于什么,我们可以看到冲突是否会导致问题。
答案 3 :(得分:1)
使用具有M个可能值的均匀随机散列函数,N个散列后发生碰撞的几率为50%
N = .5 + SQRT(.25 - 2 * M * ln(.5))
查找birthday problem以获取更多分析。
如果您事先使用perfect hashing了解所有密钥,则可以避免冲突。