精华内容
下载资源
问答
  • 需要在脚本文件夹中创建mysqldump.exe和7z.exe的符号链接。 脚本需要在创建SecureString密码哈希的帐户上运行 为了增加安全性,用于登录MySQL的帐户应具有执行备份的最小权限。 您可以轻松地从MySQL Workbench的...
  • 支持CRYPT(3)MD5 SHA-1安全哈希。 Lua中的计算(5.1) 作者Yura Vdovytchenko 麻省理工学院许可证 当前版本15.05.19(按发布日期分类) 描述 nginx的身份验证模块。 用lua写。 需要支持lua 5.1的Nginx。 该...
  • 密码哈希值在Oracle 12c数据库中调整Simeon原文链接:https://www.trustwave.com/Resources/SpiderLabs-Blog/Changes-in-Oracle-Database-12c-password-hashes/Oracle在Oracle Database 12c中对用户密码哈希进行了...

    密码哈希值在Oracle 12c数据库中调整

    Simeon

    原文链接:

    https://www.trustwave.com/Resources/SpiderLabs-Blog/Changes-in-Oracle-Database-12c-password-hashes/

    OracleOracle Database 12c中对用户密码哈希进行了改进。通过使用基于PBKDF2的SHA512哈希算法,替代过去简单的SHA1哈希加密,使得密码哈希更安全。在这篇文章中,我将解释一些变化及其安全影响。

    1.Oracle密码哈希值

    使用Oracle 11g数据库时,sys.user$表中的spare4列存储用户密码哈希值。

    这是sys.user$.spare4 用户demo使用密码“epsilon”(可插入数据库)的输入示例:

    S:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22C

    详细步骤:

    SQL> create user demo identified by epsilon;

    User created.

    SQL> select spare4 from sys.user$ where name = 'DEMO';

    S:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22C

    笔者注:查询oracle用户必须是大写名称

    sys.user$.passworddemo用户的密码值一样

    SQL> select password from sys.user$ where name = 'DEMO';

    运行结果:

    2B7983437FE9FEB6

    笔者注:

    执行查询select password from sys.user$ where name = SYS';如图1所示。

    图片1.png 

    1获取SYS用户密码值

    这将省略password值的讨论:它使用相同的算法(大写和连接用户名和密码,然后执行3DES散列)计算,跟以前的Oracle数据库版本中使用一样的算法。

    spare4 列的值由分号分隔(“ S:”,“ H:”和“ T:”)的三个部分组成。

    “S:”部分长度是60个字符或30个字节:

    8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A

    “ H:”部分长度是32个字符或16个字节:

    DC9894A01797D91D92ECA1DA66242209

    最后,“ T:”部分长度是160个字符或80个字节:

    23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22C

    那么他们究竟有什么含义呢?

    2.S部分

    Oracle数据库11g中有“ S:”部分,它的创建过程如下:

    password hash (20 bytes) = sha1(password + salt (10 bytes))

    (有关更多详细信息,请访问http://marcel.vandewaters.nl/oracle/security/password-hashes。)

    Oracle Database 12c也是如此:下面的简单测试证明了这一点。

    对于S上面的值(8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A):

    哈希是8F2D65FB5547B71C8DA3760F10960428CD307B1Csalt是6271691FC55C1F56554A

    密码是“epsilon”,所以让我们来计算SHA1哈希'epsilon' + 0x6271691FC55C1F56554A:

    import hashlib

    sha1 = hashlib.sha1()

    sha1.update("epsilon")

    sha1.update('\x62\x71\x69\x1f\xc5\x5c\x1f\x56\x55\x4a')

    sha1.hexdigest().upper()

    该计算产生:' 8F2D65FB5547B71C8DA3760F10960428CD307B1C',如图2所示。

    spacer.gif 图片2.png

    2计算epsilon的密码值

    这与11g算法相同。

    3.H部分

    $ORACLE_HOME/rdbms/admin下查看一个SQL文件时可以发现这一点:

    create or replace view DBA_DIGEST_VERIFIERS

      (USERNAME, HAS_DIGEST_VERIFIERS, DIGEST_TYPE) as

    select u.name, 'YES', 'MD5' from user$ u where instr(spare4, 'H:')>0

    union

    select u.name, 'NO', NULL from user$ u where not(instr(spare4, 'H:')>0) or spare4 is null

    /

    所以它似乎是一个MD5哈希加密。

    请注意,下面的SQL代码$ORACLE_HOME/rdbms/admin 会修改spare4 列的值以删除H: 降级。

    这是spare4.H如何计算的:用户名是大写的,然后MD5哈希加密计算其值,' XDB'和密码用冒号分隔(也即md5('DEMO:XDB:epsilon')32位加密)

    import hashlib

    m = hashlib.md5()

    m.update('DEMO:XDB:epsilon')

    m.hexdigest().upper()

    'DC9894A01797D91D92ECA1DA66242209'

    这使得可以使用预先计算密码字典的散列值来对内置的用户密码进行***,例如使用前缀SYSTEM:XDB:的系统用户密码。

    H值似乎用于XDB中的摘要式身份验证。

    4.T部分

    这仅适用于12.1.0.2。对于12c之前的版本,T部分不可用。

    我们通过更新sqlnet.ora 文件(假设客户端来自12.1.0.2发行版)来启用12c密码哈希:

    # sqlnet.ora

    SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12a

    然后重新创建演示用户(首先重新连接客户端):

    drop user demo;

    create user demo identified by epsilon;

    select spare4 from sys.user$ where name = 'DEMO';

    H:DC9894A01797D91D92ECA1DA66242209;T:E3243B98974159CC24FD2C9A8B30BA62E0E83B6CA2FC7C55177C3A7F82602E3BDD17CEB9B9091CF9DAD672B8BE961A9EAC4D344BDBA878EDC5DCB5899F689EBD8DD1BE3F67BFF9813A464382381AB36B

    注意到该spare4值不再包含“S”部分,只有“H:”部分“T”部分在那里。

    Oracle Database 12c文档中,我们可以找到这个:

    5.关于12C验证器

    基于一个包含PBKDF2和SHA512的优化算法,所以密码应该通过PBKDF2,随后SHA512来生成T(部分)。在认证期间,服务器发送所谓的AUTH_VFR_DATA (匹配值spare4.T的最后16个字节)到客户端:

    -- Server to client packet snippet

    39 39 39 00 00 00 00 0D-00 00 00 0D 41 55 54 48 999.........AUTH

    5F 56 46 52 5F 44 41 54-41 20 00 00 00 20 38 44 _VFR_DATA.....8D

    44 31 42 45 33 46 36 37-42 46 46 39 38 31 33 41 D1BE3F67BFF9813A

    34 36 34 33 38 32 33 38-31 41 42 33 36 42 15 48 464382381AB36B.H

    所以我们可以把这个T 值分成两部分(前64个字节和AUTH_VFR_DATA):

    E3243B98974159CC24FD2C9A8B30BA62E0E83B6CA2FC7C55177C3A7F82602E3BDD17CEB9B9091CF9DAD672B8BE961A9EAC4D344BDBA878EDC5DCB5899F689EBD (前128个字符或64个字节)8DD1BE3F67BFF9813A464382381AB36B (最后32个字符或16个字节AUTH_VFR_DATA)

    假设AUTH_VFR_DATA 密码设置/重置时随机生成。因此Python代码生成的第一个64字节T 是(需要PBKDF2 Python模块):

    import pbkdf2, hashlib

    AUTH_VFR_DATA = b'\x8d\xd1\xbe\x3f\x67\xbf\xf9\x81\x3a\x46\x43\x82\x38\x1a\xb3\x6b' # This is received from the server once the latest protocol is negotiated

    salt = AUTH_VFR_DATA + b'AUTH_PBKDF2_SPEEDY_KEY'

    key = pbkdf2.PBKDF2("epsilon", salt, 4096, hashlib.sha512) # Password

    key_64bytes = key.read(64) # This 64-byte derived key is encrypted by the client and sent to the server as AUTH_PBKDF2_SPEEDY_KEY

    t = hashlib.sha512() # This happens on the server after they key is decrypted from the AUTH_PBKDF2_SPEEDY_KEY value

    t.update(key_64bytes)

    t.update(AUTH_VFR_DATA)

    t.hexdigest().upper() # First 64 bytes of spare4.T: value if password is correct

    运行结果:

    E3243B98974159CC24FD2C9A8B30BA62E0E83B6CA2FC7C55177C3A7F82602E3BDD17CEB9B9091CF9DAD672B8BE961A9EAC4D344BDBA878EDC5DCB5899F689EBD

    总结

    Oracle在12c中添加了MD5哈希和基于PBKDF2的SHA512哈希加密。在Oracle文档中有一个引用:

    用于生成12C 验证的哈希密码函数是基于包含PBKDF2和SHA-512的非优化算法。PBKDF2算法通常被介绍为当拥有12C的验证者找回原密码时,面对***者所面临的挑战时的非对称计算算法。

      笔者注:由于Oracle 12C验证器存在,通过抓包,可以通过暴力破解来获取Oracle的密码,后续内容为笔者补充。

    6.PBKDF2简介及其算法

    1)PBKDF2简介

    PBKDF2简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如***一个密码所需的rainbow table有1千万条,建立所对应的rainbow table所需要的时间就是115天。这个代价足以让大部分的***者忘而生畏。

    2)PBKDF2算法

     DK = PBKDF2(P,S,c,dkLen)

    可选项: RPF 基本伪随机函数(hLen表示伪随机函数输出的字节长度)

    输入:

      P 口令,一字节串

      S 盐值,字节串

    c 迭代次数,正整数

    dkLen 导出密钥的指定字节长度,正整数,最大约(2^32-1)*hLen

    输出: DK 导出密钥,长度dkLen字节

    步骤:

    1. 如果dkLen>(2^32-1)*hLen,输出“derived key too long”并停止。

      2. 假设l是导出密钥的hLen个字节块的个数,r表示最后一个块的字节数。

    l = CEIL (dkLen / hLen) ,

      r = dkLen - (l - 1) * hLen .

    这里,CEIL(x)是“ceiling”函数,即,大于或等于x的最小整数。

    4. 对于导出密钥的每一块,运用函数F于口令P、盐S、迭代次数c和块索引以计算块:

    T_1 = F (P, S, c, 1) ,

      T_2 = F (P, S, c, 2) ,

      ...

      T_l = F (P, S, c, l) ,

    这里函数F定义为基本伪随机函数PRF应用于口令P和盐S的串联和块索引i的前c次循环的异或和。

    F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c

    其中

    U_1 = PRF (P, S || INT (i)) ,

      U_2 = PRF (P, U_1) ,

      ...

      U_c = PRF (P, U_{c-1}) .

    这里,INT(i)是整数i的四字节编码,高字节在先。

    3. 串联各块,抽取前dkLen字节以产生导出密钥DK:

    DK = T_1 || T_2 || ... || T_l<0..r-1>

    4. 输出导出密钥DK。

    注意:函数F的构造遵循“belt-and-suspenders”方法。U_i次循环被递归计算以消除敌手的并行度;它们被异或到一起以减少有关递归退化到一个小的值集的担忧。

    密码解密:

    select username, password from dba_users;

    hashcat -m 10200 -a 0 oracle.hash -o oracle.txt --remove oracle.hash wordlist.txt

    hashcat -m 1800 -a 3 oracle.hash ?d?d?d?d?d?d?d?d?d?d?d


    展开全文
  • Flask框架中密码的加盐哈希加密和验证功能的用法详解 核心: generate_password_hash:是一个密码加盐哈希函数,生成的哈希值可通过 check_password_hash:函数用于验证经过generate_...详情可参考上面的链接 ...

    Flask框架中密码的加盐哈希加密和验证功能的用法详解

    核心:
    generate_password_hash:是一个密码加盐哈希函数,生成的哈希值可通过
    check_password_hash:函数用于验证经过generate_password_hash哈希的密码。若密码匹配,则返回真,否则返回假。

    详情可参考上面的链接

    展开全文
  • 哈希函数

    2020-11-03 01:04:21
    且总共有16位,这就是所谓哈希码, 这就是哈希函数的返回值。 能表示的数值范围是: 哈希函数的性质: 哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域是固定的范围(一定位数的bit),假设...

    有一对 哈希元 a,b
    我们可以用下面式子造出哈希函数来
    在这里插入图片描述
    磁力链接总共有16位,每一位数值范围是0-f,这就是所谓哈希码,
    即哈希函数的返回值。

    百度百科:哈希码具体是什么?
    答:hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值

    能表示的数值范围是????????:每位都是 2的16次方 ,共有16位,所以16个2的16次方。
    在这里插入图片描述
    哈希函数的性质:
    哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域是固定的范围(一定位数的bit),假设为S(虽然S可能会很大,但是和输入域没法比),并具有如下性质:

    1. 典型的哈希函数都有无限的输入值域
    2. 当给哈希函数传入相同的输入值时,返回值一样。
    3. 当给哈希函数传入不同的输入值时,返回值可能一样,也可能不一样,这时当然的,因为输出域统一是S,所以会有不同的输入值对应在S中的一个元素上(这种情况称为 哈希冲突)。
    4. 最重要的性质是很多不同的输入值所得到的返回值会均匀分布在S上。这是评价一个哈希函数优劣的关键不同输入值所得到的所有返回值越均匀地分布在S上,哈希函数越优秀,并且这种均匀分布与输入值出现的规律无关。比如,“aaa1”、“aaa2”、“aaa3”三个输入值比较类似,但经过优秀的哈希函数计算后得到的结果应该相差非常大。
    5. 哈希函数的离散性:举个例子就明白了,输入域是0-98的范围输出域是0 1 2

    给我99个不同的样本,依次计算不同的输出 0 1 2这三种值
    基本上在算完之后,可以说:
    有33个输入分布在0位置
    有33个输入分布在1位置
    有33个输入分布在2位置

    前3点性质是哈希函数的基础,第4点是评价一个哈希函数优劣的关键,不同输入值所得到的所有返回值越均匀地分布在S上,哈希函数越优秀,并且这种均匀分布与输入值出现的规律无关。

    比如,“aaa1”、“aaa2”、“aaa3”三个输入值比较类似,但经过优秀的哈希函数计算后得到的结果应该相差非常大。

    比如在一个房间里面。砸了一瓶香水,这些香水的分子,会固定不动。而哈希函数就是彻底把它打乱的过程。

    我们把每一个香水分子的运动轨迹通过哈希函数来确定,经过哈希函数计算后,香水分子会均匀分布在整个房间内!
    在这里插入图片描述

    哈希函数不是随机函数,其没有任何随机的成分,样本一旦固定,返回值一定是确定的!

    哈希函数会打乱输入规律。

    经哈希函数 计算完的返回值,和你原始的输入规律是没有关系的!
    在这里插入图片描述
    在这里插入图片描述
    且在0-1上也均匀分布。
    比如,
    在这里插入图片描述
    若是在0-98上均匀分布,那么在0-2上也是均匀分布

    面试官是不会让我们实现哈希函数的,因为哈希函数算法很多

    一个十六进制的字符等于4个二进制字节 16=2^4
    假设一个哈希函数得到2的64次方的范围
    所以需要2的8次方乘以2的16次方
    在这里插入图片描述
    我们把得到的结果批两段,
    在这里插入图片描述
    在这里插入图片描述
    h3相对h1和h2是独立的
    在这里插入图片描述
    我们可以通过改变系数,做出1000个哈希函数
    0位置得到0-f的均匀分布 和其他位置得到0-f的均匀分布是互相独立的
    所以,我们通过各个位置的组合 ,本身就可以得到多个哈希函数
    在这里插入图片描述

    哈希函数极其重要,甚至比哈希表还重要
    因为哈希表的实现一定要知道哈希函数的性质!

    初级6刚开始

    展开全文
  • 哈希表和哈希冲突

    2021-03-06 16:36:53
    当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。 作为“键” 的对象经过哈希处理,所得到的散列被用作存储其对应的值的索引;换言之,可以根据一个key值来直接访问数据,因此查找速度快。 散列...

    哈希表(也叫散列表)是什么?

    哈希表通过存储键/值对,来实现其数据结构的功能。

    当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。

    作为“键” 的对象经过哈希处理,所得到的散列码被用作存储其对应的值的索引;换言之,可以根据一个key值来直接访问数据,因此查找速度快。

    散列码可以理解为:把一堆对象按照某种规则,散到各自的小团体里去,可以提升数据处理速率和查找速率。这里所提到的“规则”(或者称为方法,也可以称为一种函数),在哈希表中称为散列函数(又称为哈希函数)。

    键值对和Entry

    哈希表存放的是键值对,即 key-value,即一个值对应另外一个值(例如,学生的学号和其姓名相对应,学号作为其中的 key,而姓名是该学号对应的哈希值)。

    键值对在JDK中称为Entry。

    哈希冲突

    记散列函数为 f(x),那么其中的 x 称为 key;如果两个取值不同的x对应是 f(x) 的值相同,称此情况为哈希冲突(又称为哈希碰撞)。

    哈希冲突的处理方式有开放寻址法拉链法

    展开全文
  • 参考链接from werkzeug.security import generate_password_hash,check_password_hash#哈希加盐的密码加密方法 def enPassWord(password):#将明密码转化为hash return generate_password_hash(password)#返回转换...
  • libtomcrypt以前,git存储库包含doc / crypt.pdf,以获取详细文档。 ...以前,git存储库包含doc / crypt.pdf,以获取详细文档。 ... 项目状态Travis CI主:开发:AppVeyor主:开发:Coverity ABI实验室API / ABI更改:在...
  • libtomcrypt 以前,git存储库包含doc/crypt.pdf以获取详细文档。 对此进行了更改,现在只能从相应版本的tarball或从页面获得该文件。 项目状态 特拉维斯CI 主: 开发: AppVeyor 主: ... 然后,我们可以为您提供...
  • 哈希

    千次阅读 2018-07-24 08:28:58
    开散列法:首先对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一个集合,每一个子集称为一个桶,个桶中元素通过单链表链接起来,各链表的头节点存储在哈希表中。 bucket.h 1 #pragma once 2...
  • 在区块链中,下一个区块和上一个区块通过哈希链接。 我建议,像类似非人名命名,而是用某个东西来命名的算法(不管中英文),最好的学习方式就是从名字本身入手,因为算法被命名的时候,设计者肯定是有某种联想的...
  • 首先对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。 2.开散列的实现 存...
  • 开散列法对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点组成 一个向量,因此,向量的元素个数与可能的...
  • 哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做...
  • 开散列法又叫链地址法(开链法),首先对关键集合用散列函数计算散列地址,具有相同地址的关键 归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结 点存储在哈希表中。...
  • 有关安装和说明链接。 您可以使用以下命令在终端中检查Python 3和pip3的版本 $ python3 --version $ pip3 --version 入门 在终端中,创建并导航到要将PyPass安装到的目录。 $ mkdir pypass $ cd ~/pypass 安装...
  • 对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个...
  • 哈希表(下)

    2018-09-14 18:11:15
    首先对关键集合用哈希函数计算哈希地址,具有相同哈希地址的关键归于同一子集合中,每一个子集合称为一个桶,各个桶中的元素通过一个单链表的方式链接起来(可以头插的方式将桶中元素链接起来),链表的...
  • 开散列法又叫链地址法(开链法),首先对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。...
  • 哈希表的java实现

    2019-10-31 13:19:00
    1.哈希表是通过关键key来直接进行访问的一种数据结构 2.也就是它通过关键来值映射到表中的一个位置来访问记录,进而加快访问的速度 3.存放记录的数组叫做散列表(哈希表) 哈希表的根据解决冲突方式不同分为的两种...
  • 哈希指针链的探讨

    千次阅读 2018-09-06 14:38:45
    这个链表链接一系列的区块,每个区块包含数据以及指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告诉前一个区块的位置,也提供一个哈希值去验证这个区块所包含的...
  •  本程序支持在系统中所有文件的右键菜单中添加一个快捷链接,通过单击该链接可以快速查看任意文件的校验。启用该功能的方法是首先运行 HashVerification.exe,然后在主窗口任意位置单击右键,在选项菜单中开启...
  • (第一次接触哈希,先从一个一个题目开始慢慢理解吧 。。) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。 输入格式: 输入首先给出正整数N(≤10​5),为通话记录条数。随后N行,每行给出一条通话...
  • 哈希表之开散列

    2018-06-04 18:31:07
    通常,每个桶对应的链表结点都很少,将n个关键通过某一个散列函数,存放到散列表中的m个桶中,那么每一个桶中链表的平均长度为n/m,以搜索平均长度为n/m的链表代替搜索长度为n的顺序表,搜索效率快的多。...
  • 【数据结构】哈希

    千次阅读 2018-04-04 20:56:39
    开散列法又叫链地址法,首先对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点组成一个向量。说起来可能很...
  • 用于快速图像检索的深度学习二进制哈希码 本文记录博主CVPR阅读心得,如理解有误,请及时指正交流。THANKS! 相关链接 论文解读 论文动机 论文主要贡献 具体研究方案 论文实验 论文翻译 相关链接: 论文...
  • 哈希---开散列

    2020-06-09 15:18:21
    **开散列法又叫链地址法(开链法),首先对关键集合用散列函数计算散列地址,具有相同地址的关键归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。...
  • 前面我们讲了哈希冲突的闭散列(开放定址法)的两种方法,现在我们来介绍另一种方法:开散列法。 通常,每个桶中的同义词子表都很短,设有n个关键通过某一个散列函数,存放到散列表中的m个桶中,那么每一...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 344
精华内容 137
关键字:

哈希码链接