zoukankan      html  css  js  c++  java
  • 快速了解Hash算法

     

     

    1.hash

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 -- 来自百度百科

    大白话: 任意输入值都有一个固定长度的输出

    2.hash算法

    hash算法很多,下面是Java中,字符串计算hashcode的源码:

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    

    很多人会疑惑为什么会是31?

    1. 31时是质数(只能分解成1和自身)可以增加结果的唯一性,因为哈希算法(也叫散列函数)要尽可能的平均分布
    2. 虚拟机可以优化计算速度.

    当然,也可以不使用31用其他值代替...,单元测试模拟一下

    @Test
    public void test01(){
      String s = "Hello";
      System.out.println(s.hashCode());
      
      int code = (int)'H';
      code = 31*code + (int)'e';
      code = 31*code + (int)'l';
      code = 31*code + (int)'l';
      code = 31*code + (int)'o';
      System.out.println(code);
    }
    

     


     

     

    参考资料

  • 相关阅读:
    安装高版本的docker
    Apache JMeter汉化手册
    安装python包
    Jmeter Cluster
    doc下设置永久环境变量的好方法
    jmeter非常好的博客收藏
    mysql-学习链接
    python 脚本
    常见python快捷键
    2015年心情随笔--周围太烦躁,我想静静
  • 原文地址:https://www.cnblogs.com/linyufeng/p/9946116.html
Copyright © 2011-2022 走看看