python练习001-实现hashcode

  卧槽居然有人看,罪过罪过。。。

  简单说下原理:

  hash是一种常用的算法,像md5.sha,常用在安全加密等方面;

  java中hashcode是用于快速查找对象物理存储区使用的,hashcode值不存在,则可以快速存储入集合;

  java官方给出的计算hashcode的算法:

  1. Integer.hashCode()实现:

    public int hashCode(){

    return value;

     }

  就是(10进制)整数的hashcode还是它本身;

  2. String.hashCode()实现为其ACII字符码:

  public int hashCode() {
    int h = hash;
    if (h == 0) {
      int off = offset;
      char val[] = value;
      int len = count;
      for (int i = 0; i < len; i++) {
      h = 31*h + val[off++];
        }
      hash = h;
      }
    return h;
  }

  就是字符串转换成ASCII码的值:

  比如:abc, ascii表中字母对应的ASCII码分别为:97、98、99

  那么,“abc”.hashcode() = 99+98*31+97*31*31=96354

  那么知道了怎么求它,就可以在python中来计算它:

  java中str的hashcode是按照32位算的,那么在64位的python我们要考虑处理内存溢出的问题,代码如下:

  def convert_n_bytes(n, b):

      bits = b * 8

      return (n + 2 ** (bits - 1)) % 2 ** bits - 2 ** (bits - 1)

  def convert_4_bytes(n):

      return convert_n_bytes(n, 4)

  def getHashCode(str):

      h = 0

      n = len(str)

      for i, c in enumerate(str):

          h = h + ord(c) * 31 ** (n - 1 - i)

      return convert_4_bytes(h)

  print(getHashCode(input(str)))

 

posted @ 2020-07-19 23:57  沈一愣  阅读(1547)  评论(0编辑  收藏  举报