`

用python写Long.valueof().hashcode()

 
阅读更多

    最近工作碰到这么个小问题,分享一下:

    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

 

0
0
分享到:
评论

相关推荐

    string-hashcode:java.lang.String.hashCode

    安装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),valueOf()方法

    在Java编程语言中,将对象转换为字符串是一个常见的操作,主要涉及到`toString()`、`(String)`类型转换以及`String.valueOf()`这三个方法。了解它们的区别和使用场景对于编写高质量的Java代码至关重要。 首先,`...

    equals与hashCode方法讲解

    return Objects.hashCode(key) ^ Objects.hashCode(value); } equals 方法和 hashCode 方法都是用于比较两个对象是否相等的,但它们的实现方式不同。equals 方法是比较两个对象的内容是否相等,而 hashCode 方法是...

    java中Hashcode的作用.docx

    "Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...

    深入 HashCode 方法~

    - 使用 `HashCode` 计算出的索引值可以快速地访问到数组中的某个位置,从而实现快速查找。 2. **HashCode 在哈希表中的应用**: - 在 Java 中,常用的哈希表实现包括 `HashMap` 和 `Hashtable`。 - 这些数据结构...

    jquery.hash.min.js 和 jquery.ba-hashchange.min.js

    在网页开发中,jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 DOM 操作、事件处理和动画制作等任务。而 `jquery.hash.min.js` 和 `jquery.ba-hashchange.min.js` 这两个文件则是在 jQuery 基础上扩展了对...

    java.lang包

    在示例中,我们看到`Byte.valueOf()`、`Short.valueOf()`、`Integer.valueOf()`和`Long.valueOf()`这些方法分别用于将字符串转换为对应的包装类对象。 `String`类是`java.lang`包中的另一个重要组成部分,用于处理...

    hashCode的作用

    如果没有使用`hashCode`,则每次查找特定`ID`对应的`Person`对象时,都需要遍历整个数组,效率较低。而通过使用`hashCode`,可以根据`ID`的值快速定位到对象可能所在的数组位置,大大提高了查找效率。 #### 3. 集合...

    如何正确实现Java中的HashCode共6页.pdf.z

    在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键方法。这个方法的主要目的是为对象生成一个整数哈希码,通常用于存储和检索对象时提高性能,特别是在使用哈希表(如`HashMap`、`HashSet`...

    HashCode的用法详解

    如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两个对象,它们的 hashCode 都是 1,那么它们将会被存放在同一...

    hashcode的作用

    - 常见的实现方式包括:使用各个属性的 `hashCode()` 结果进行某种数学运算(如加法、乘法等),或者直接使用某个关键属性的哈希值。 2. **示例代码**: ```java public class MyClass { private String ...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    java中hashcode()和equals()的详解.docx

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    Python-Leaked20一个用于检查Hashcodes密码和电子邮件是否泄露的工具

    这个工具是用Python编程语言编写的,因此对于熟悉Python的开发者来说,理解和使用它会相对容易。在当前网络安全环境中,数据泄露已经成为一个严重的问题,个人隐私和信息安全受到了巨大威胁。因此,使用像Leaked? ...

Global site tag (gtag.js) - Google Analytics