我查看了源代码,但Arrays.hashCode(char[] c)
我不太确定它适用的算法在所有情况下都能正常工作。
public static int hashCode(int a[]) {
if (a == null)
return 0;
int result = 1;
for (int element : a)
result = 31 * result + element;
return result;
}
哈希函数是否在这里实现了真正均匀地分布所有输入数组的原因。为什么在这里使用质数31。
为什么使用质数31?
这可以分为两部分吗?
- 为什么是素数?
在这里,我们需要了解我们的目标是为对象获取 唯一的 HashCode,这将有助于我们在O(1)时间内找到该对象。
这里的关键词是 唯一的 。
素数
质数是唯一数字。它们的独特之处在于,由于使用了素数来构成素数,因此素数与任何其他数字的乘积具有唯一性的最大可能性(不像素数本身那样唯一)。此属性在哈希函数中使用。
。
为什么是31号?
从 有效的Java
这是完整的报价,
从项目9:重写等于时,始终重写hashCode:
选择值31是因为它是奇数质数。如果是偶数且乘法溢出,则信息将丢失,因为乘以2等于移位。使用质数的优势尚不清楚,但这是传统的。
31的一个不错的特性是乘法可以用移位(第15.19节)和减法代替,以获得更好的性能:
31 * i ==(i << 5)-i现代VM自动执行这种优化。
尽管此项目中的配方产生了相当不错的哈希函数,但它没有产生最新的哈希函数,Java平台库也没有提供1.6版以上的哈希函数。编写这样的哈希函数是一个研究主题,数学家和理论计算机科学家最好去做。
也许该平台的更高版本将为其类和实用程序方法提供最新的哈希函数,以允许普通程序员构造此类哈希函数。同时,此项中描述的技术应适合大多数应用。
这是一个很好的来源。
我有一个有几个消费者的消费群体。每个使用者被分配到一组分区。消费者何时轮询选择了已使用分区的消息?它是在消费者端完成的,还是Kafka服务器决定使用哪个分区? 我的一些分区有很多消息,但有些分区没有或几乎没有。但我仍然需要我的消费者平等地使用分配给它的每个分区。因此,我需要我的消费者快速遍历分区,最好从每个分配的分区轮询x条消息。 我在用https://github.com/appsignal/r
0.1-0.2:********** 0.2-0.3:******** 0.3-0.4:********* 0.5-0.6:********* 0.6-0.7:********* 0.7-0.8:********* 0.4-0.5:********* 0.5-0.6:********* 0.6-0.7:********* 0.1-0.2:********* 0.2-0.3:********* 0.
我可以使用这个问题中的技巧来强制初始分区和最终分区之间的关系,但是Spark不知道每个原始分区的所有内容都将转移到一个特定的新分区。因此,它不能优化掉洗牌,而且它的运行速度比慢得多。
我们在AWS上运行16个节点kafka集群,每个节点是m4. xLargeEC2实例,具有2TB EBS(ST1)磁盘。Kafka版本0.10.1.0,目前我们有大约100个主题。一些繁忙的话题每天会有大约20亿个事件,一些低量的话题每天只有数千个。 我们的大多数主题在生成消息时使用UUID作为分区键,因此分区分布相当均匀。 我们有相当多的消费者使用消费群体从这个集群消费。每个使用者都有一个唯一的
问题内容: 我知道如果我使用Java的Random生成器,并使用nextInt生成数字,则数字将均匀分布。但是,如果我使用2个Random实例,并使用两个Random类生成数字,会发生什么。数字是否会均匀分布? 问题答案: 每个实例生成的数字将均匀分布,因此,如果将两个实例生成的随机数序列组合在一起,则它们也应均匀分布。 请注意,即使结果分布是均匀的,您也可能要注意种子,以避免两个生成器的输出之间
我有9个ignite服务器实例,其缓存处于模式,在这种模式下,我用Kafka从分区并行加载数据。这里的分区包含的条目数可以通过字段唯一标识,我还使用将条目从一个分区配置到一个实例。我将key定义为, 因此,我试图在ignite实例中的缓存项和分区之间实现一对一的映射,例如。但在我的例子中,我得到的映射是, 这里实现了关联配置部分,即具有相同分区ID的条目缓存在相同的ignite实例上。但是,数据在
我们有一个带有操作的管道,分成两个工作负载-在第一组中,是CPU密集型的工作负载,它们被放入同一个插槽共享组,比方说。和,因为它使用大容量上载并在内存中保存大量数据。它被发送到插槽共享组。 此外,工作负载和工作负载的并行度级别不同,因为第一个工作负载受源并行度的限制。例如,我们的并行度为50,同时并行度等于78。我们有8个TMs,每个有16个内核(因此也有插槽)。 在这种情况下,理想的插槽分配策略
问题内容: 我不是在谈论String类或哈希码被覆盖的任何其他类。假设如果我只是创建该类的新对象,那么在任何情况下the或true 都将返回该对象的内存地址? 问题答案: 不必要。从文档(重点是我的): 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来 实现 , 但是JavaTM编程语言不需要这种实现技术 。)