我有一个拥有许多计算机名称的网络。我想为每个计算机名分配一个int值,以便我可以集群具有接近int值的计算机名称。同一群集中的计算机名称应该是共享相同前缀的计算机(前缀的长度不是常量),并且只有后缀不同(后缀的长度不是常量)才会具有相对接近的值。
例如,假设我有3个计算机名称: 1.' wber1637' 2.' wbcx9999' 3.' abcx9999'。 第一个和第二个名称具有相同的前缀(在这种情况下,前缀的长度为2 - ' wb'),因此我希望它们将被赋予彼此接近的int值。相比之下,与其他两个名称具有不同前缀的第三个名称(尽管具有相同的后缀,' cx9999',作为第二个名称)应该被赋予一个远离int的int值。其他两个名字的值。
答案 0 :(得分:0)
将名称中的字符视为数字本身
这样,从类似开头开始的名称大小大致相同,如果结尾不同则会有较小的变化
例如:
ascii中的 wber1637
个字母是0x77,0x62,0x65,0x72,0x31,0x36,0x33,0x37
将他们变成一个数字以获得0x7762657231363337 - 8602549779357381431 十进制
ascii中的 wbcx9999
个字母是0x77,0x62,0x63,0x78,0x39,0x39,0x39,0x39
将他们变成一个数字得到0x7762637839393939 - 8602547606238345529 十进制
与abcx9999相比,它们有点接近彼此(请注意它们是如何从860254开始的)
ascii中的 abcx9999
个字母是0x61,0x62,0x63,0x78,0x39,0x39,0x39,0x39
将他们变成一个数字得到0x6162637839393939 - 7017280537403930937 十进制
wbcx9999
和wber1637
之间的差异为 2173119035902
wbcx9999
和abcx9999
之间的差异为 1585267068834414592
在java中,生成
是一项简单的任务String name = "wber1637";
long output = 0; //note that an 8 digit string fits exactly into a long
for(char c : name.toCharArray())
output = (output << 8) + c;