2012-09-10 42 views
1

我有一个要求,我有一组事先不知道的字符串(例如“phy”,“link”,“maca”)Java:字符串到7位哈希

我有2个程序在那里我只有7位发送来沟通字符串。

如果我事先知道这些字符串,我可以说“phy”= 1“link”= 2等等,但是我想自动执行此操作,在这两个程序中我都有两个函数用一些编码方式。

private int getHash(String agent) {   
     return 0; 
    } 
    private String getAgentIDfromHash(int hash) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

所以int将是一个7位int。我可以尝试对字符串中的所有字符进行异或运算,但我想知道是否有更好的方法来实现它? 有什么想法?

回答

1

标准字符串hashCode函数被设计为分布良好。

所以你可以简单地从agent.hashCode()(你想要的,但最好是低位)中取7位。

请注意,无论您做什么,您都不能有7位的非常低的冲突概率。 2⁷仅为128.您应该可以找到字符串集的一个属性,以实现更好的解决方案。

+0

任何7位将分布良好? – rinku

+0

低位当然更好,但我记得读过研究报告说它对任何一组字节都没有那么坏。请注意,这是一个合理的命题,不是最好的命题,hashCode有时会受到批评。 –

+0

如果我使用“phy”.hashCode()&0x7f ..为字符串集我知道我得到不同的值..我的字符串不会超过5-6个字符 – rinku

1

有了这么少的位数,你必须格外小心不要发生碰撞。最低限度将是程序首先在内部检查他们是否与他们自己的(已知)部分名称产生冲突。

理想情况是两个程序都知道整个键集,以便它们可以产生7位ID到名称的映射,并且映射在两侧都是相同的(不管键集是什么)。