最近工作碰到这么个小问题,分享一下:
java中我们常见的用来分片的方法就是取模,一般的方法就是
Math.abs(Long.valueOf(value).hashCode()) % shardingBase
在我们用一个脚本语言(例如这次的Python)去维护程序的时候,有时候我们需要一个同样的方法
现在问题来了,这么简单的一个方法怎么用Python来表示?
难道是:
long(value) % shardingbase
最后运行发现,基本不太一样。
我们看java在Long的hashcode()方法实现代码可以模仿出这个逻辑
在java8源码中,Long.valueof()源码核心代码如下:
final int offset = 128; if (l >= -128 && l <= 127) { // will cache return LongCache.cache[(int)l + offset]; } return new Long(l); //做了一个缓存,在此没大意义 private static class LongCache { private LongCache(){} static final Long cache[] = new Long[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Long(i - 128); } }
我们发现这个方法用Python来写基本没什么难度。没什么区别,主要区别看来就是在Java的hashCode()方法实现了,这个方法源码如下:
public int hashCode() { return Long.hashCode(value); } public static int hashCode(long value) { return (int)(value ^ (value >>> 32)); }
看来我们的主要任务就是把值右移动32位然后和本身做异或操作。因为我的问题是id不可能为负数,所以有符号右移和无符号右移再这对我没什么区别,这个问题好像也不大。这个地方的主要问题就是这个强转。Python中不存在int溢出的情况,因为他会自动将他转成一个long类型存放,所以,数子大一些的话用Python写出来的肯定不会是负数,结果肯定跟java不一样。所以这个时候Python应该这样写:
def longToInt(value): assert isinstance(value, (int, long)) return int(value & sys.maxint) def int_overflow(val): maxint = 2147483647 if not -maxint-1 <= val <= maxint: val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1 return val //Python写法 abs(int_overflow(longToInt(id ^ (id >> 32)))) % 200 //java写法 Math.abs(Long.valueOf(id).hashCode()) % 200
相关推荐
安装npm install string-hashcode 例子var hashCode = require ( 'string-hashcode' ) ;var s = 'abc' ;console . log ( s . hashCode ) ; // undefinedvar code = hashCode ( s ) ;console . log ( s . hashCode ) ...
在Java编程语言中,将对象转换为字符串是一个常见的操作,主要涉及到`toString()`、`(String)`类型转换以及`String.valueOf()`这三个方法。了解它们的区别和使用场景对于编写高质量的Java代码至关重要。 首先,`...
return Objects.hashCode(key) ^ Objects.hashCode(value); } equals 方法和 hashCode 方法都是用于比较两个对象是否相等的,但它们的实现方式不同。equals 方法是比较两个对象的内容是否相等,而 hashCode 方法是...
"Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...
- 使用 `HashCode` 计算出的索引值可以快速地访问到数组中的某个位置,从而实现快速查找。 2. **HashCode 在哈希表中的应用**: - 在 Java 中,常用的哈希表实现包括 `HashMap` 和 `Hashtable`。 - 这些数据结构...
在网页开发中,jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 DOM 操作、事件处理和动画制作等任务。而 `jquery.hash.min.js` 和 `jquery.ba-hashchange.min.js` 这两个文件则是在 jQuery 基础上扩展了对...
在示例中,我们看到`Byte.valueOf()`、`Short.valueOf()`、`Integer.valueOf()`和`Long.valueOf()`这些方法分别用于将字符串转换为对应的包装类对象。 `String`类是`java.lang`包中的另一个重要组成部分,用于处理...
如果没有使用`hashCode`,则每次查找特定`ID`对应的`Person`对象时,都需要遍历整个数组,效率较低。而通过使用`hashCode`,可以根据`ID`的值快速定位到对象可能所在的数组位置,大大提高了查找效率。 #### 3. 集合...
在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键方法。这个方法的主要目的是为对象生成一个整数哈希码,通常用于存储和检索对象时提高性能,特别是在使用哈希表(如`HashMap`、`HashSet`...
如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两个对象,它们的 hashCode 都是 1,那么它们将会被存放在同一...
- 常见的实现方式包括:使用各个属性的 `hashCode()` 结果进行某种数学运算(如加法、乘法等),或者直接使用某个关键属性的哈希值。 2. **示例代码**: ```java public class MyClass { private String ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...
这个工具是用Python编程语言编写的,因此对于熟悉Python的开发者来说,理解和使用它会相对容易。在当前网络安全环境中,数据泄露已经成为一个严重的问题,个人隐私和信息安全受到了巨大威胁。因此,使用像Leaked? ...