Skip to main content

哈希

密码哈希函数是广泛使用的密码原语,将任意长度的输入映射到固定长度的输出,即哈希值。哈希函数被设计为一种单向函数,这意味着从给定的哈希值中找到输入数据是不可行的,同时它还需要具备碰撞抵抗性,这意味着找到两个不同的输入映射到相同的哈希值是不可行的。

Sui 的 Move API 支持以下密码哈希函数:

  • SHA2-256,标识为 std::hash::sha2_256
  • SHA3-256,标识为 std::hash::sha3_256
  • Keccak256,标识为 sui::hash::keccak256
  • Blake2b-256,标识为 sui::hash::blake2b256

用法

SHA2-256 和 SHA3-256 哈希函数可在 Move 标准库的 std::hash 模块中找到。以下示例演示了如何在智能合约中使用 SHA2-256 哈希函数:

module test::hashing_std {
use std::hash;
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
use std::vector;

/// Object that holds the output hash value.
struct Output has key, store {
id: UID,
value: vector<u8>
}

public fun hash_data(data: vector<u8>, recipient: address, ctx: &mut TxContext) {
let hashed = Output {
id: object::new(ctx),
value: hash::sha2_256(data),
};
// Transfer an output data object holding the hashed data to the recipient.
transfer::public_transfer(hashed, recipient)
}
}

Keccak256 和 Blake2b-256 哈希函数通过 Sui Move Library 中的 sui::hash 模块提供。以下是在智能合约中使用 Keccak256 哈希函数的示例。请注意,这里哈希函数的输入是作为引用给出的。对于 Keccak256 和 Blake2b-256,情况都是如此。

module test::hashing_sui {
use sui::hash;
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
use std::vector;

/// Object that holds the output hash value.
struct Output has key, store {
id: UID,
value: vector<u8>
}

public fun hash_data(data: vector<u8>, recipient: address, ctx: &mut TxContext) {
let hashed = Output {
id: object::new(ctx),
value: hash::keccak256(&data),
};
// Transfer an output data object holding the hashed data to the recipient.
transfer::public_transfer(hashed, recipient)
}
}