Java哈希实用程序

Java哈希实用程序,java,performance,Java,Performance,我正在寻找一个好的哈希实用程序或框架来将字符串映射到范围内的某个int值,比如{1..k} 我应该在运行时组件中使用它,该组件接收来自“userId”为string的用户的大量并发请求,我希望将该值映射到定义的整数范围 当然,userId值的长度可能不同,但我可以假设使用此函数的最小长度 应该很快 谢谢每个Java对象都有一个内置的hashCode方法,它返回一个int。对于字符串,它是为您预定义的,需要为自定义对象实现 将此映射到1…k,其中k是整数,考虑使用模数: String hi = "

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

当然,userId值的长度可能不同,但我可以假设使用此函数的最小长度

应该很快


谢谢

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

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

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

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

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

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

您可以继续使用JDK附带的HashTable或HashMap。在两者之间做出选择,具体到这一点

HashMap时,对Hashtable的访问在表上同步 不是

HashMap中的迭代器是故障安全的,而 哈希表不是

HashMap允许其中包含空值,而Hashtable不允许。 HashMap是自JDK1.2以来新集合框架的一部分

如果您有数百万个条目,请选择一个数据库。去吧


这里类似的问题

您可以继续使用JDK附带的HashTable或HashMap。在两者之间做出选择,具体到这一点

HashMap时,对Hashtable的访问在表上同步 不是

HashMap中的迭代器是故障安全的,而 哈希表不是

HashMap允许其中包含空值,而Hashtable不允许。 HashMap是自JDK1.2以来新集合框架的一部分

如果您有数百万个条目,请选择一个数据库。去吧


这里有一个类似的问题

如果您想要的是一个无法轻松反转的安全哈希,请使用消息摘要:

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();
}

如果您正在寻找一个无法轻松反转的安全哈希,请使用消息摘要:

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();
}

您可以使用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比创建字符串本身要快得多。如果这不够快,我会首先避免使用/创建字符串。你不太可能需要这么做

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

int hash = (text.hashCode() & 0x7FFFFFFF) % K + 1;
或者如果您不想丢弃顶部的位

int hash = (int) ((text.hashCode() & 0xFFFFFFFFL) % K + 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比创建字符串本身要快得多。如果这不够快,我会首先避免使用/创建字符串。你不太可能需要这么做

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

int hash = (text.hashCode() & 0x7FFFFFFF) % K + 1;
或者如果您不想丢弃顶部的位

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

您是在寻找哈希表的哈希还是唯一ID?当两个用户ID映射到同一个整数时会发生什么?这称为碰撞,必须加以处理。String.hashCode已经完成了一项合理的工作,您可以通过执行str.hashCode%k+1将结果放入{1..k}中,但我看到了问题-这不起作用,因为hashCode是用于引用的,因此两个相同的字符串将获得不同的hashCode`public static void mainString[]参数{Scanner input=new ScannerSystem.in;System.out.printlniter str:;String str1=input.nextLine;System.out.printlniter str:;String str2=input.nextLine;System.out.printlnstr1.hashCode++str2.hashCode;}`这是输出:@Julias,这是不正确的。我建议您查看String.hashCode的代码,或者自己尝试。如果您想添加代码和示例,我建议您在问题中包括这一点。注释不能很好地处理代码。注意:您是在寻找哈希表的哈希还是唯一ID?当两个用户ID映射到同一个整数时会发生什么?不是his称为冲突,必须处理。String.hashCode已经做了合理的工作,您可以通过执行str.hashCode%k+1将结果放入{1..k}中,但我看到了问题-这不起作用,因为hashCode用于引用,因此两个相同的字符串将获得不同的hashCode ` public static void mainString[]参数{Scanner input=new ScannerSystem.in;System.out.printlniter str:;String str1=input.nextLine;System.out.printlniter str:;String str2=input.nextLine;System.out.printlnstr1.hashCode++str2.hashCode;}'这是输出:@Julias,这是不正确的。我建议您查看String.hashCode的代码,或者自己尝试。如果您想添加代码和示例,我建议您在问题中包含这一点。注释不处理cod
e井:返回一个int而不是long所有genious想法都是最简单的:-谢谢,我会有一个好的值分布吗?请注意,使用%可能会破坏hashCode分布。你可以考虑用除法来缩放它。哈希代码可以是否定的,例如尝试更长的字符串。StevenSchlansker对于非常大的值来说,这是一个问题,在这种情况下,您需要使用长哈希代码,甚至是BigDecimal。通常,小于一百万的小值返回一个int而不是long。所有的好主意都是最简单的:-谢谢,我会有一个好的值分布吗?请注意,使用%可能会破坏hashCode分布。你可以考虑用除法来缩放它。哈希代码可以是否定的,例如尝试更长的字符串。StevenSchlansker对于非常大的值来说,这是一个问题,在这种情况下,您需要使用长哈希代码,甚至是BigDecimal。通常,小于一百万的小值有数百万个不同的用户