Hash

Hash[expr]

给出表达式 expr 的一个整数哈希码.

Hash[expr,type]

给出表达式 expr 的一个指定类型的整数哈希码.

Hash[expr,type,"format"]

按指定格式给出哈希码.

更多信息

  • 对于同样的表达式 exprHash[expr,] 总是给出相同的结果.
  • 可能的哈希码类型包括:
  • "Adler32"Adler 32 位循环冗余码校验
    "BLAKE2b-512"512 位 BLAKE2b 编码
    "BLAKE2s-256"256 位 BLAKE2s 编码
    {"BLAKE2b",b}任意长度 b 最大高达 512 位的 BLAKE2b 编码
    {"BLAKE2s",b}任意长度 b 最大高达 256 位的 BLAKE2s 编码
    {"BLAKE2bp",b}BLAKE2b 的多核并行版本
    {"BLAKE2sp",b}BLAKE2s 的多核并行版本
    {"BLAKE2xb",b}任意长度 b 最大高达 256 GiB 的 BLAKE2xb 编码
    {"BLAKE2xs",b}任意长度 b 最大高达 128 GiB 的 BLAKE2xs 编码
    "CRC32"32 位循环冗余码校验
    "Keccak224"224 位 Keccak 编码
    "Keccak256"256 位 Keccak 编码
    "Keccak384"384 位 Keccak 编码
    "Keccak512"512 位 Keccak 编码
    {"Keccak",b}长度 b 为 224、256、384、512 位的 Keccak 编码
    "MD2"128 位 MD2 编码
    "MD4"128 位 MD4 编码
    "MD5"128 位 MD5 编码
    "RIPEMD160"160 位 RIPEMD 编码
    "RIPEMD160SHA256"RIPEMD-160 后跟 SHA-256(在比特币中使用)
    "SHA1"160 位 SHA-1 编码
    "SHA224"224 位 SHA 编码
    "SHA256"256 位 SHA 编码
    "SHA256SHA256"双 SHA-256 编码(在比特币中使用)
    "SHA384"384 位 SHA 编码
    "SHA512"512 位 SHA 编码
    {"SHA",b}长度 b 为 224、256、384、512 位的 SHA 编码
    "SHA3-224"224 位 SHA3 编码
    "SHA3-256"256 位 SHA3 编码
    "SHA3-384"384 位 SHA3 编码
    "SHA3-512"512 位 SHA3 编码
    {"SHA3",b}长度 b 为 224、256、384、512 位的 SHA3 编码
    "Expression"表达式哈希码(默认)
  • 对于可变长度的哈希值,长度 b 必须是8的倍数.
  • "Expression" 哈希码是根据表达式的内部表示计算出来的,并且可能因计算机系统或不同版本的 Wolfram 语言而异.
  • 对于在字节序列上操作的哈希码类型(如 "SHA"),Hash[expr,] 根据以下内容先将 expr 转换成字节:
  • expr基于 ToString[FullForm[expr]] 的字节
    "string"string 的 UTF-8 表示中的字节
    ByteArray[]字节数组中的文字字节
  • 可能的格式包括:
  • "Integer"整数(默认)
    "DecimalString"十进制字符串
    "HexString"十六进制字符串
    "HexStringLittleEndian小端 (little-endian) 字节顺序的十六进制字符串
    "Base36String"base-36 字母数字字符串
    "Base64Encoding"Base64 编码
    "ByteArray"以显式的字节数组形式给出的哈希码

范例

打开所有单元关闭所有单元

基本范例  (4)

给出字符串的哈希码:

数据的数字指纹:

SHA256 给出十六进制形式的哈希码:

指定 SHA 哈希码的输出长度:

范围  (12)

给出一个普通表达式的哈希码:

等价于:

比较所有不同格式的哈希码:

计算不同长度的 "BLAKE2b" 哈希码:

用整数给出的 512 位的 SHA 编码:

用十进制字符串给出的 512 位的 SHA 编码,包括开头的零:

比较哈希码的不同字符串表示:

ByteArray 给出的双 SHA 编码:

字节数组包含了 256 位的编码结果:

查看数组中的各个字节:

RIPEMD160SHA256 哈希实际上是一个重复的哈希:

在使用 ByteArray 或字符串时,对文字字节进行哈希编码:

对于非 ASCII 字符,用 UTF-8 表示进行哈希编码:

计算长度为零的字节的加密哈希码:

计算所需长度的 BLAKE2xs 哈希码:

应用  (2)

提供一个校验和用以检验数据的完整性:

改变某些数据:

校验和改变了:

一个并置的加密哈希函数:

abcdef 的哈希码:

属性和关系  (12)

相同表达式的哈希码总是相同的:

不同的哈希码来自不同的输入:

默认哈希码为 "Expression"

"Expression" 哈希码满足机器字长:

首位是零:

"Integer" 为默认格式:

"DecimalString""Integer" 的字符串版本,必要的情况下添上零:

"HexString" 是基数为 16 的表示,必要的情况下添上零:

"Base36String" 是基数为 36 的表示,必要的情况下添上零:

"Base64Encoding" 用 Base64 编码对结果的字节进行编码:

"ByteArray" 是基数为 256 的表示:

将基数为 256 的结果转换成整数:

结果相同:

可以通过使用 ByteArray 作为中间结果获得重复的哈希码:

FileHash[file,code] 实际上等同于 Hash[ReadByteArray[file],code]

可能存在的问题  (3)

整数 ListHash 使用列表的序列化版本作为表达式:

如果想要对文字字节进行哈希编码,请使用 ByteArray

可用 ASCII 字符串对 7 位字节值进行哈希编码:

表达式的 Hash 和包含表达式的 FullForm 的字符串是不同的:

Hash 考虑完整的符号名称,包括它的 Context,这可能导致产生不同的哈希值:

巧妙范例  (2)

哈希冲突非常罕见,但有可能发生. 以下是两个字节列表:

它们是不同的:

有两处不同:

对两个字节序列进行哈希编码:

它们的哈希码是相同的:

不同类型的哈希值的分布:

Wolfram Research (1988),Hash,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Hash.html (更新于 2022 年).

文本

Wolfram Research (1988),Hash,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Hash.html (更新于 2022 年).

CMS

Wolfram 语言. 1988. "Hash." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2022. https://reference.wolfram.com/language/ref/Hash.html.

APA

Wolfram 语言. (1988). Hash. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/Hash.html 年

BibTeX

@misc{reference.wolfram_2024_hash, author="Wolfram Research", title="{Hash}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/Hash.html}", note=[Accessed: 22-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_hash, organization={Wolfram Research}, title={Hash}, year={2022}, url={https://reference.wolfram.com/language/ref/Hash.html}, note=[Accessed: 22-November-2024 ]}