php hash算法类

简介: php hash算法类

hash算法,又称散列算法,杂凑算法

它可以将一个长度不固定的数据,通过算法,获取其特征值生成一个固定的,较短的数据,压缩其文件标识.

实现用一个较短的数据进行标识一个大数据标识.比如用32位字符串的md5,标识整个文件

我们可以自定义一个算法,将中文字符串,只获取拼音首字母的特征,转成hash:

"仙士可"=>'xsk'

"阿伟死了"=>'awsl'

如果使用中文表示,需要的字符串长度是字母缩写的2-4倍.

重复性

通过上面的例子,我们可能会发现一些问题,例如: "啊我死了" ,"阿王死了",都会对应 'awsl'

这时候,就发生了 哈希冲突,  不同的数据,可能会因为提取特征值,而产生相同的hash结果

逆推性

可以发现,我们可以通过 "sl","sb","nt"等字母,很容易隐隐约约的知道原来的中文意思

这就造成了如果我们中文的一句话如果都有这些意思,那生成的hash重复性将会非常大.

因此,一个优秀的hash算法,应该具备以下条件:

1:正向快速计算,能通过输入的数据,在有限的时间,利用有限的资源就能计算出hash值(比如说你要用数据 做1亿次加减乘除法计算,虽然很难重复了,但是每次都计算1亿次,非常不现实)

2:逆向困难,hash字符串不能直接被逆向推算出.

3:输入敏感,原始信息就算多了一个空格,也应该跟原来的字符串非常不一致

4:冲突避免,hash的数据应该尽可能避免冲突,均匀分布,否则将失去hash本身的特性

目前最经典的hash算法有md5,time33,sha

在实际使用中,md5是字符串hash,并且性能较差,php在hashtable中hash计算使用的是time33算法.

最后附带上使用php实现的各种流行hash算法

<?php
class Hash
{
    /**
     * 加法hash
     * additiveHash
     * @param string $key
     * @param int    $mask
     * @return int
     * @author tioncico
     * Time: 11:38 上午
     */
    public static function additiveHash(string $key, $mask = 0x8765fed1)
    {
        for ($hash = strlen($key), $i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash += $charIndex;
        }
        return ($hash % $mask);
    }
    /**
     * 旋转hash
     * rotatingHash
     * @param string $key
     * @param int    $mask
     * @return int
     * @author tioncico
     * Time: 11:38 上午
     */
    public static function rotatingHash(string $key, $mask = 0x8765fed1)
    {
        for ($hash = strlen($key), $i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash << 4) ^ ($hash >> 28) ^ $charIndex;
        }
//        return ($hash % $prime);
        return ($hash ^ ($hash >> 10) ^ ($hash >> 20)) & $mask;
    }
    /**
     * 一次一个hash
     * oneByOneHash
     * @param     $key
     * @param int $mask
     * @return int
     * @author tioncico
     * Time: 11:38 上午
     */
    public static function oneByOneHash(string $key, $mask = 0x8765fed1)
    {
        for ($hash = strlen($key), $i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash += $charIndex;
            $hash += $hash << 10;
            $hash ^= $hash >> 6;
        }
        $hash += ($hash << 3);
        $hash ^= ($hash >> 11);
        $hash += ($hash << 15);
        return $hash & $mask;
    }
    public static function time33(string $key)
    {
        // hash($i) = hash($i-1) * 33 + str\[$i\]
        $hash = 5381;
        for ($i = 0; $i < strlen($key); $i++) {
            // (hash << 5) + hash 相当于 hash * 33
            //$hash = sprintf("%u", $hash * 33) + ord($s{$i});
            //$hash = ($hash * 33 + ord($s{$i})) & 0x7FFFFFFF;
            $charIndex = ord($key\[$i\]);
            $hash = ($hash << 5) + $hash + $charIndex;
        }
        return $hash & 0x7FFFFFFF;
    }
    public static function fnvHash(string $key, $mask = 0x8765fed1, $mShift = 0)
    {
        $hash = 2166136261;
        $p = 16777619;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash * $p) ^ $charIndex;
        }
        if ($mShift == 0) {
            return $hash;
        }
        return ($hash ^ ($hash >> $mShift)) & $mask;
    }
    public static function fnvHash1(string $key)
    {
        $p = 16777619;
        $hash = 2166136261;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash * $p) ^ $charIndex;
        }
        $hash += $hash << 13;
        $hash ^= $hash >> 7;
        $hash += $hash << 3;
        $hash ^= $hash >> 17;
        $hash += $hash << 5;
        return $hash;
    }
    public static function intHash(int $key)
    {
        $key += ~($key << 15);
        $key ^= ~(self::uRight($key, 10));
        $key += ~($key << 3);
        $key ^= ~(self::uRight($key, 6));
        $key += ~($key << 11);
        $key ^= ~(self::uRight($key, 16));
        return $key;
    }
    protected static function uRight($a, $n)
    {
        $c = 2147483647 >> ($n - 1);
        return $c & ($a >> $n);
    }
    public static function rsHash(string $key)
    {
        $b = 3787551;
        $a = 636789;
        $hash = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash * $a) + $charIndex;
            $a = $a * $b;
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function jsHash(string $key)
    {
        $hash = 1315423911;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = (($hash << 5) + $charIndex + ($hash >> 2));
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function pjwHash(string $key)
    {
        $bitsInUnsignedInt = 32;
        $threeQuarters = ($bitsInUnsignedInt * 3) / 4;
        $oneEighth = $bitsInUnsignedInt / 8;
        $highBits = 0xFFFFFFFF << ($bitsInUnsignedInt - $oneEighth);
        $hash = 0;
        $test = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash << $oneEighth) + $charIndex;
            if (($test = $hash & $highBits) != 0) {
                $hash = (($hash ^ ($test >> $threeQuarters)) & (~$highBits));
            }
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function elfHash(string $key)
    {
        $hash = 0;
        $x = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash << 4) + $charIndex;
            if (($x = (int)$hash & 0xF0000000 != 0)) {
                $hash ^= ($x >> 24);
                $hash &= ~$x;
            }
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function bkdrHash(string $key)
    {
        $hash = 0;
        $seed = 131; //31 131 1313 13131 131313
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash * $seed) + $charIndex;
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function sdbmHash(string $key)
    {
        $hash = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = $charIndex + ($hash << 6) + ($hash >> 15) - $hash;
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function dekHash(string $key)
    {
        $hash = strlen($key);
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = ($hash << 5) ^ ($hash >> 27) ^ $charIndex;
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function apHash(string $key)
    {
        $hash = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash ^= (($i & 1) == 0) ? (($hash << 7) ^ $charIndex ^ ($hash >> 3)) : (~(($hash << 11) ^ $charIndex ^ ($hash >> 5)));
        }
        return ($hash & 0x7FFFFFFF);
    }
    public static function javaHash(string $key)
    {
        $hash = 0;
        for ($i = 0; $i < strlen($key); $i++) {
            $charIndex = ord($key\[$i\]);
            $hash = 31 * $hash + $charIndex;
        }
        return ($hash & 0x7FFFFFFF);
    }
}

参考文章:https://blog.csdn.net/wzygis/article/details/101112678

目录
相关文章
|
9天前
|
存储 监控 算法
基于 PHP 布隆过滤器的局域网监控管理工具异常行为检测算法研究
布隆过滤器以其高效的空间利用率和毫秒级查询性能,为局域网监控管理工具提供轻量化异常设备检测方案。相比传统数据库,显著降低延迟与资源消耗,适配边缘设备部署需求,提升网络安全实时防护能力。(238字)
92 0
|
7月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
126 1
|
3月前
|
机器学习/深度学习 算法 安全
深度长文I 深度合成服务类-算法备案该怎么做?
本文详解“深度合成服务类”算法及其备案要求,涵盖定义、类型、备案流程等内容,助你全面理解合规要点。
|
3月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
123 1
|
4月前
|
运维 监控 算法
局域网屏幕监控软件 PHP 图像块增量传输算法解析
本文探讨了一种基于PHP语言开发的图像块增量传输算法,适用于局域网屏幕监控场景。通过将屏幕图像分块处理、计算哈希值并对比变化区域,该算法显著降低了网络带宽占用,提升了监控效率。在企业管理和远程教育中,该技术可实现终端设备的实时监控与远程管控,同时支持与生物识别等技术融合,拓展应用范围。实验表明,该算法在常规办公场景下可减少90%以上的数据传输量,展现了良好的实时性和优化效果。
71 3
|
5月前
|
监控 算法 安全
基于 PHP 的员工电脑桌面监控软件中图像差分算法的设计与实现研究
本文探讨了一种基于PHP语言开发的图像差分算法,用于员工计算机操作行为监控系统。算法通过分块比较策略和动态阈值机制,高效检测屏幕画面变化,显著降低计算复杂度与内存占用。实验表明,相比传统像素级差分算法,该方法将处理时间缩短88%,峰值内存使用量减少70%。文章还介绍了算法在工作效率优化、信息安全防护等方面的应用价值,并分析了数据隐私保护、算法准确性及资源消耗等挑战。未来可通过融合深度学习等技术进一步提升系统智能化水平。
83 2
|
5月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
146 2
|
6月前
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
107 1
|
6月前
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
105 3
|
6月前
|
存储 监控 算法
论内网电脑监控软件中 PHP 哈希表算法的深度剖析与探究
当代企业网络管理体系中,内网电脑监控软件占据着关键地位。其功能涵盖对员工电脑操作行为的实时监测,以此维护企业信息安全,同时助力企业优化网络资源配置,提升整体工作效能。在构建内网电脑监控软件的诸多技术中,数据结构与算法构成了核心支撑体系。本文聚焦于哈希表这一重要数据结构,深入剖析其在 PHP 语言环境下,如何为内网电脑监控软件的高效运作提供助力,并通过详实的代码示例予以阐释。
96 3

热门文章

最新文章

下一篇
oss教程