漫哈希游戏平台谈散列函数
哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏说到散列,一般对应于散列表(哈希表)和散列函数。我们今天不谈哈希表,仅谈下散列函数。定义引一段关于散列函数的定义。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同;
中,很明确地提出“散列函数必须具有不可逆性”,而的表述则模棱两可,相比之下,后者显得太不严谨了。
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
其精髓在于“严格雪崩准则”:当任何一个输入位被反转时,输出中的每一位均有50%的概率发生变化。
两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。
对应于散列,如果“部分改变输入值”, 前后两个两个散列的海明距离为散列长度的一半(也就是有一半的bit不相同),则为“50%的概率发生变化”。
定义一个类,如果让IDE自动生成hashCode()函数的话,其实现也是类似的:
而知乎上也有很多大神做了分析:hash算法的数学原理是什么,如何保证尽可能少的碰撞
从第二个链接给出的评分对比可以看出,BKDRHash虽然实现简单,但是很有效(冲突率低)。
这样的用法,最常见的还是MD5,有的网站可能会用文件的MD5作为检索文件的key,
MD5生成的消息摘要有128bit, 如果要标识的对象不多,冲突率会很低;
当冲突率远远低于硬件损坏的概率,那么可以认为用MD5作为key是可靠的。
顺便提一下,UUID其实也是128bit的精度,只是其为了方便阅读多加了几个分割线而已。
之所以看到BKDRHash用来索引对象,主要是看到这篇文章(笔者没有研究过Volley源码):
不能说它是散列函数,因为其返回值长度并不固定,按照定义,不能称之为散列函数,虽然思想很接近。
笔者编了程序比较其二者的冲突率,前者比后者要高一些(篇幅限制,不贴测试代码了,有兴趣的读者可自行测试)。
32bit的散列,无论哪一种,只要数据集(随机数据)上10^6, 基本上每次跑都会有冲突。
64bit的散列,只要性能不是太差,如果数据的长度是比较长的(比方说20个字节的随机数组),即使千万级别的数据集也很难出现冲突(笔者没有试过上亿的,机器撑不住)。
笔者曾经也是BKDRHash的拥趸,并在项目中使用了一段时间(作为缓存的key)。
看了知乎心里一惊,回头修改了下测试用例,构造随机数据时用不定长的数据,比方说1-30个随机字节,
之前是知道BKDRHash的混淆性不足的(比方说最后一个字节的值加1,hash值也只是加1而已,如果未溢出的话);
但是由于其实现简单,以及前面那个不合理的测试结果,就用来做缓存的key了,毕竟Volley也这么干了。
实际上也没有太大的问题,因为用的地方输入通常比较长,而且要缓存的文件也不是很多(几百上千的级别),所以应该不会有冲突。
如截图所示,很多大名鼎鼎的开源组件都用到这个散列,那其究竟是何方神圣呢?让我们来一探究竟。
而且C++可以将int64的指针指向char数组,可以一次算8个字节,对于长度较长的数组,运算更快。
很神奇的是,CRC64和BKDRHash的冲突率是一样的(测了很多次,都是一样),可能是都存在溢出问题的原因。
如果把随机数组的长度调整为1-50,则前者(BKDRHash & CRC64)的冲突率会相对降低,而后者的运算效率会稍胜于前者。
我想MurmurHash之所以应用广泛,应该不仅仅是因为其冲突率低,还有一个很重要的特性:
构造随机数组,每次改变其中一个bit,计算MurmurHash,码距在31-32之间。
或者从另一个角度看,MurmurHash算出的散列值比较“均匀”,这个特点很重要。
以一年365天算,23人(及以上),有两人生日相同的概率大约50%;而如果到了60人以上,则概率已经大于99%了。
如果随机数是32位,那么可能性有约43亿种,但是只要数量达到50000个,其冲突概率就有25%。
我们常看到MD5作为文件索引,SHA,MD5用于文件校验,就是因为其冲突概率很低,想要篡改文件还保持Hash不变,极其困难。
不过困难不意味着不可能,例如,Google建议不要使用SHA-1加密了,
扯远了,回到前面说的缓存key,64bit的MurmurHash, 当缓存数量在10^4这个级别时,
有两个缓存的key冲突的概率是10^-12(万亿份之一)的量级,应该是比较可靠的。
如果觉得还不够,可以用128bit的MurmurHash,仅做索引的线要更合适(运算快,低碰撞,高混淆)
散列广泛应用于计算机的各个领域,了解散列函数的一些性质,对于解决工程问题或有帮助,
k8s 1.24.3版本使用nfs-provisioner4.0.0动态创建PV
k8s 1.24.3版本使用nfs-provisioner4.0.0动态创建PV
Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大纲 / 文件管理 / 导入与导出 ……
Barnes-Hut t-SNE是一种针对大规模数据集的高效降维算法,它是t-SNE的变体,用于高维数据可视化。t-SNE通过保持概率分布相似性将数据从高维降至2D或3D。Barnes-Hut算法采用天体物理中的方法,将时间复杂度从O(N²)降低到O(NlogN),通过构建空间索引树和近似远距离交互来加速计算。在scikit-learn中可用,代码示例展示了如何使用该算法进行聚类可视化,成功分离出不同簇并获得高轮廓分数,证明其在大數據集上的有效性。
【2月更文挑战第30天】 在机器学习的实践中,构建一个高效且准确的预测模型是每个数据科学家的核心任务。本文将深入探讨如何通过一系列策略性步骤来提升模型的性能,包括数据预处理、特征选择、模型训练以及超参数调优。我们将讨论各种技术方法,并通过实例展示这些策略是如何在实际问题中应用的。目标是为读者提供一套实用的工具和思路,以应对机器学习项目中遇到的挑战。
今天学习了几个命令,是创建、删除文件和文件夹的,在linux里,文件夹是目录,下面说下我学习的命令。 创建文件夹【mkdir】 一、mkdir命令使用权限 所有用户都可以在终端使用 mkdir 命令在拥有权限的文件夹创建文件夹或目录。 二、mkdir命令使用格式 格式:mkdir [选项] DirName 三、mkdir命令功能
【云周刊】第133期:阿里云全球十四个节点评测分析及服务器地域选择攻略
Kubeflow实战系列:利用TensorFlow Serving进行模型预测
Codeforces Round #326 (Div. 2) B. Pasha and Phone C. Duff and Weight Lifting
2025 年 Adobe Acrobat Reader、万兴 PDF 阅读器、Sumatra PDF 三款高性价比 PDF 阅读器推荐
基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案
ubuntu 24.04 (noble) 起,ubuntu软件源设置文件位置与方式已改变
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)