Java哈希实用程序

时间:2012-03-07 07:44:57

标签: java performance

我正在寻找一个好的哈希实用程序框架来将字符串映射到范围内的某个int值,例如{1 .. k} 我应该在运行时组件中使用它,它接收来自用户的大量并发请求,其中'userId'是字符串,我想将该值映射到定义的整数范围。

当然userId值的长度可能不同但是我可以使用此函数来确定最小长度

它应该非常快

由于

4 个答案:

答案 0 :(得分:3)

每个Java对象都有一个内置hashCode方法,该方法返回int。对于String,它是为您预先定义的(需要为自定义对象实现)。

要将此映射到1..k,其中k是整数,请考虑使用模数:

String hi = "Hello";
int hash = (hi.hashCode() % K) + 1;

答案 1 :(得分:1)

您可以使用String.hashCode()。

String a1 = "Hello World";
String a2 = new String(a1); // don't do this unless you have to have a different object.
System.out.println("Identity hashCode " + System.identityHashCode(a1) + " != " + System.identityHashCode(a2));
System.out.println("String.hashCode " + a1.hashCode() + " == " + a2.hashCode());

打印

Identity hashCode 551677275 != 1353056826
String.hashCode -862545276 == -862545276

就性能而言,hashCode()比创建String本身要快得多。如果这还不够快,我会首先避免使用/创建String。 (你不太可能需要这样做)

每次运行程序时,标识哈希码都会更改。注意:hashCode()可以为负数,因此您必须对此进行调整。

int hash = (text.hashCode() & 0x7FFFFFFF) % K + 1;

或者如果您不想丢弃最高位

int hash = (int) ((text.hashCode() & 0xFFFFFFFFL) % K + 1);

答案 2 :(得分:0)

您可以继续使用JDK附带的HashTable或HashMap。在两者之间进行选择,归结为此,

  • HashMap在桌面上同步对Hashtable的访问 不是

  • HashMap中的迭代器是故障安全的,而枚举器是 Hashtable不是。

  • HashMap允许空值,而Hashtable则不允许。

HashMap是新集合框架的一部分(自JDK 1.2起)

如果您有数百万条记录去数据库。转到NoSQL

此处类似问题HashMap in Java, 100 Million entries

答案 3 :(得分:0)

如果您正在使用安全散列(无法轻松撤消),请使用消息摘要:

try {
    MessageDigest msgDigest = MessageDigest.getInstance("MD5");
    byte digest[] = msgDigest.digest(username.getBytes());
    int secureHash = 1 + new BigInteger(digest).mod(BigInteger.valueOf(k)).intValue();

    System.out.println("Secure hash " + secureHash);
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}