首页 > 其他分享 >hash hacker

hash hacker

时间:2024-10-05 21:47:07浏览次数:8  
标签:hacker hash struct int hs MAXN 哈希 include

一.单哈希

https://oi-wiki.org/string/hash/

二.双哈希

首先构造两个字符串 \(A,B\) 满足其在 \((b_1,p_1)\) 下哈希值相同,这样由 \(A,B\) 组成的字符串在 \((b_1,p_1)\) 下哈希值相同

再使用一次卡单哈希的构造方法即可。

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define MAXN 60000

int b1 , p1 , b2 , p2;
struct node {
    char s[ 32 ]; int hs;
}a[ MAXN + 5 ] , b[ MAXN + 5 ];
int cmp( const void *a , const void *b ) {
    struct node *aa = a;
    struct node *bb = b;
    return ( aa->hs > bb->hs ) ? 1 : -1;
}
char s[ 2 ][ 7 ]; int hs[ 2 ];

int main( ) {
    srand( 2024 );

    scanf("%d %d",&b1,&p1);
    scanf("%d %d",&b2,&p2);

    for( int i = 1 ; i <= MAXN ; i ++ ) {
        for( int j = 0 ; j < 7 ; j ++ ) {
            a[ i ].s[ j ] = rand() % 26;
            a[ i ].hs = ( 1ll * a[ i ].hs * b1 + a[ i ].s[ j ] + 1 ) % p1;
        }
    }
    qsort( a , MAXN , sizeof( a[ 1 ] ) , cmp );

    for( int i = 1 ; i < MAXN ; i ++ ) if( a[ i ].hs == a[ i + 1 ].hs ) {
        int f = 0;
        for( int j = 0 ; j < 7 ; j ++ ) f |= a[ i ].s[ j ] != a[ i + 1 ].s[ j ];
        if( f ) {
            for( int j = 0 ; j < 7 ; j ++ ) {
                s[ 0 ][ j ] = a[ i ].s[ j ];
                hs[ 0 ] = ( 1ll * hs[ 0 ] * b2 + s[ 0 ][ j ] + 1 ) % p2;
                s[ 1 ][ j ] = a[ i + 1 ].s[ j ];
                hs[ 1 ] = ( 1ll * hs[ 1 ] * b2 + s[ 1 ][ j ] + 1 ) % p2;
            }
            break;
        }
    }

    // printf("!%d %d\n", hs[ 0 ] , hs[ 1 ] );
    int bp = 1ll * b2 * b2 % p2 * b2 % p2 * b2 % p2 * b2 % p2 * b2 % p2 * b2 % p2;
    for( int i = 1 ; i <= MAXN ; i ++ ) {
        for( int j = 0 ; j < 32 ; j ++ ) {
            b[ i ].s[ j ] = rand() % 2;
            b[ i ].hs = ( 1ll * b[ i ].hs * bp + hs[ b[ i ].s[ j ] ] ) % p2;
        }
    }
    qsort( b , MAXN , sizeof( b[ 1 ] ) , cmp );

    for( int i = 1 ; i < MAXN ; i ++ ) if( b[ i ].hs == b[ i + 1 ].hs ) {
        int f = 0;
        for( int j = 0 ; j < 32 ; j ++ ) f |= b[ i ].s[ j ] != b[ i + 1 ].s[ j ];
        if( f ) {
            for( int j = 0 ; j < 32 ; j ++ )
                for( int k = 0 ; k < 7 ; k ++ )
                    putchar( s[ b[ i ].s[ j ] ][ k ] + 'a' );
            putchar('\n');
            for( int j = 0 ; j < 32 ; j ++ )
                for( int k = 0 ; k < 7 ; k ++ )
                    putchar( s[ b[ i + 1 ].s[ j ] ][ k ] + 'a' );
            return 0;
        }
    }
    assert( 0 );
    return 0;
}

标签:hacker,hash,struct,int,hs,MAXN,哈希,include
From: https://www.cnblogs.com/chihik/p/18448522

相关文章

  • Hashtable  Complete the following
    Assignment3:Hashtable Assignment3:HashtableDueNoDueDate Points100Submittingafileupload StartAssignment Language:JavaorPythonorC++ TaskDescription:Completethefollowingtask. Task-1:ImplementaHashdatastructurefromscratch.Yo......
  • HashiCorp联合创始人:Go是成功且无悔的选择
    HashiCorp联合创始人:Go是成功且无悔的选择TonyBai ​关注他 42人赞同了该文章 提到HashiCorp这个公司,可能很多人都没听说过。但提到vagrant、consul、nomad、terraform或者vault,那么你一定对这些工具或其中之一有所耳闻。这些工具都是HashiCorp这......
  • 五、redis之hash
    redis的hash类型就是平时说的hash表,字典。类似于Java中的HashMap。可以用来存储对象等结构。现在看下操纵hash类型的命令。HGETHGETkeyfieldhget获取hash中的field字段的值。HSETHSETkeyfieldvalue[fieldvalue...]hset命令将多个fieldvalue键值对设置到key中。......
  • Google-Hacker-搜索引擎使用技巧
    搜索引擎使用技巧1.谷歌关键字汇总12.Googlehacker汇总网站3.bing搜索引擎示例4.google关键字最新5.bing高级搜索关键字6.谷歌语法生成网站1.Google常用语法1.1常用关键字说明site指定域名site:*.edu.cn限定域名后缀为edu.cn的网站inurlURL中存在的关键字inurl:......
  • 代码随想录算法训练营第六天|理解hash表
    WhatisHashTable?引用自文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。哈希函数通过hashCode把......
  • HashMap原理
    HashMap原理在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:publicnativeinthashCode();```根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。为何Object类需要这样一个方法?它......
  • ConcurrentHashMap是怎么实现的?
    1.是什么    ConcurrentHashMap 是Java并发包(java.util.concurrent)中的一个线程安全的哈希表实现。与 HashMap 相比,ConcurrentHashMap 在并发环境下具有更高的性能,因为它允许多个线程并发地进行读写操作而不会导致数据不一致。以下是 ConcurrentHashMap 实现的一......
  • hash冲突解决
     解决方法:拉链法,又称为链地址法其基本思想是将所有具有相同哈希值的元素链接在一起,形成一个链表。 解决方法:开放地址--线性探测法https://www.cnblogs.com/-beyond/p/7726347.html关注点:1、hash冲突元素的插入2、已有元素的删除和同hash值元素的移动3、扩容 1、插入......
  • Redis渐进式rehash
    为什么要渐进式rehash?在Redis中,哈希表是实现快速键值对查找的关键数据结构,但随着数据的增加,哈希表可能会因为冲突过多或空间不足而需要扩容;相反,当数据大量删除后,哈希表也可能因为空间利用率过低而需要缩容。在扩容和缩容过程中,由于长度变化会导致key的索引变化,为了避免一次性r......
  • 精通推荐算法31:行为序列建模之ETA — 基于SimHash实现检索索引在线化
    1 行为序列建模总体架构2SIM模型的不足和为什么需要ETA模型SIM实现了长周期行为序列的在线建模,其GSU检索单元居功至伟。但不论Hard-search还是Soft-search,都存在如下不足:GSU检索的目标与主模型不一致。Hard-search通过类目属性来筛选历史行为,但不同类目不代表相关度低,比......