Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长整数标识符在桶中的均匀分布_Java_Long Integer_Hashcode_Modulo_Uniform Distribution - Fatal编程技术网

Java 长整数标识符在桶中的均匀分布

Java 长整数标识符在桶中的均匀分布,java,long-integer,hashcode,modulo,uniform-distribution,Java,Long Integer,Hashcode,Modulo,Uniform Distribution,我有一组庞大的长整数标识符,需要尽可能均匀地分布到(n)个存储桶中。长整数标识符可能有一些缺少的标识符。 以此为标准,按原样使用长整数和执行模(n)[长整数]之间有区别吗?还是最好为长整数的字符串版本生成哈希代码(以改善分布),然后执行模(n)[字符串的哈希_代码(长整数)]?通过散列码获得均匀排列是否需要额外的字符串转换 因为我得到的反馈是我的问题没有足够的背景信息。我在补充一些信息 标识符基本上是在表示项目id的数据库中自动生成的自动递增数字行标识符。缺少标识符的原因是删除 标识符本身是长整

我有一组庞大的长整数标识符,需要尽可能均匀地分布到(n)个存储桶中。长整数标识符可能有一些缺少的标识符。 以此为标准,按原样使用长整数和执行模(n)[长整数]之间有区别吗?还是最好为长整数的字符串版本生成哈希代码(以改善分布),然后执行模(n)[字符串的哈希_代码(长整数)]?通过散列码获得均匀排列是否需要额外的字符串转换

因为我得到的反馈是我的问题没有足够的背景信息。我在补充一些信息

标识符基本上是在表示项目id的数据库中自动生成的自动递增数字行标识符。缺少标识符的原因是删除

标识符本身是长整数。 标识符(项目)本身在某些情况下为(10s-100)+百万,在某些情况下为数千

只有在标识符数量达到数百万的情况下,我才真正希望将它们分散到存储桶(标识符计数>>存储桶计数)中,以便存储在无SQL系统(分区)中

我想知道是否由于项目被删除的事实,我应该求助于(Long).toString().hashCode()来获得均匀排列,而不是直接使用长数值。我有一种感觉,执行toString.hashCode不会给我带来太多好处,我也不喜欢java hashCode在java修订版中不能保证相同的值这一事实(尽管对于String,他们的hashCode实现在过去的版本中似乎是有文档记录的,并且多年来是稳定的)
)没有必要涉及
字符串

new Integer(i).hashCode()
。。。为您提供一个散列-设计用于均匀分布到桶中

new Integer(i).hashCode() % n
。。。将在您想要的范围内给您一个数字


但是
Integer.hashCode()
只是:

 return value;

因此,
新整数(i).hashCode()%n
相当于
i%n

不需要涉及
字符串

new Integer(i).hashCode()
。。。为您提供一个散列-设计用于均匀分布到桶中

new Integer(i).hashCode() % n
。。。将在您想要的范围内给您一个数字


但是
Integer.hashCode()
只是:

 return value;

因此,
newinteger(i).hashCode()%n
相当于
i%n

无法回答您的问题@斯利姆的尝试是你能得到的最好结果,因为你的问题中缺少关键信息

  • 要分发一组项目,您必须了解它们的初始分发情况。
如果它们是均匀分布的桶的数量明显高于输入的范围,那么斯利姆的答案就是正确的。如果这两个条件中的任何一个都不成立,它就不会起作用

  • 如果输入的范围没有明显高于存储桶的数量,则需要确保输入的范围是存储桶数量的精确倍数,否则最后一个存储桶将无法获得同样多的项目。例如,在[0-999]和400个存储桶的范围内,前200个存储桶获取项目[0-199]、[400-599]和[800-999],而其他200个存储桶获取IEM[200-399]和[600-799]

    也就是说,你一半的桶最终比另一半多出50%的物品

  • 如果它们不是均匀分布的,因为模算子除了包裹它之外不会改变分布,所以输出分布也不是均匀的

    这是您需要哈希函数的时候

    但要构建哈希函数,您必须知道如何描述输入分布。散列函数的作用是打破输入中重复出现的、可预测的方面

公平地说,有些散列函数在大多数数据集上工作得相当好,例如Knuth的乘法方法(假设输入不太大)。你可以说,计算

hash(input) = input * 2654435761 % 2^32
它擅长打破价值观的集群。然而,它在可整除性方面失败了。也就是说,如果大多数输入都可以被2整除,那么输出也会被2整除。[贷记]


我发现有一个有趣的不同哈希函数及其特征的汇编,您可以选择一个最符合数据集特征的。

您的问题无法回答@斯利姆的尝试是你能得到的最好结果,因为你的问题中缺少关键信息

  • 要分发一组项目,您必须了解它们的初始分发情况。
如果它们是均匀分布的桶的数量明显高于输入的范围,那么斯利姆的答案就是正确的。如果这两个条件中的任何一个都不成立,它就不会起作用

  • 如果输入的范围没有明显高于存储桶的数量,则需要确保输入的范围是存储桶数量的精确倍数,否则最后一个存储桶将无法获得同样多的项目。例如,在[0-999]和400个存储桶的范围内,前200个存储桶获取项目[0-199]、[400-599]和[800-999],而其他200个存储桶获取IEM[200-399]和[600-799]

    也就是说,你一半的桶最终比另一半多出50%的物品

  • 如果它们不是均匀分布的,因为模算子除了包裹它之外不会改变分布,所以输出分布也不是均匀的

    这是您需要哈希函数的时候

    但要构建哈希函数,您必须知道如何描述输入分布。散列函数的作用是打破输入中重复出现的、可预测的方面

公平地说,有这么多