哈希游戏算法学习笔记7:字符串前缀哈希法
哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏
这里的哈希方式是一些比较特殊的哈希方式,即字符串前缀哈希。比如有一个字符串abcde,则可以先预处理出来所有前缀的哈希,比如h[1]就表示a的哈希,h[2]就表示ab的哈希,特别的,定义h[0]=0表示前0个字符的哈希值为0。
要定义某一个前缀的哈希值,只要把字符串看成是一个PPP进制的数,那么每一位的ASCII码就表示这一位的数字是多少。那么上面的例子的字符串哈希值(即对应的十进制的数值)为:
转化成数字之后这个数字可能非常大,所以要取模一下,一般是对2642^{64}264取模,在C++里就只需要直接用unsignedlonglong来存储就行了,就不需要真正的写取模这个动作了。
对字符串的每一位字符都不应该映射成0,假如把一个字符A映射成0了,那么AA映射过来就也是0,就不对了。
在哈希数字的时候可能会存在冲突,这个字符串哈希方法是不处理冲突的,经验上一般取P=131P=131P=131或者P=13331P=13331P=13331
使用这种方式,可以利用前缀哈希来求得每一个子串的哈希值,如果要求字符串下标从L到R的哈希值,只需要知道1..L-1的哈希值h[L-1],1..R的哈希值h[R]。其实要计算的L..R的哈希值就是这段数的PPP进制表示,所以其实就是在PPP进制的意义上把1..L-1这个数左移到和1..R对齐,然后再用1..R的值给它减掉就行了。
因为取模运算对加减乘都是同态的,所以用取模后的结果来计算,再取模得到的结果也一定是正确的:
因为直接用unsignedlonglong来存,所以这里的加模再取模也是没必要做的了。