添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

定义于头文件 string

template<> struct hashstd::string;

template<> struct hashstd::wstring;
template<> struct hashstd::u16string;

template<> struct hashstd::u32string; (C++11 起)

template<> struct hashstd::pmr::string;

template<> struct hashstd::pmr::wstring;
template<> struct hashstd::pmr::u16string;

template<> struct hashstd::pmr::u32string; (C++17 起)

template<> struct hashstd::u8string;
template<> struct hashstd::pmr::u8string;
(C++20 起)

std::hash 对各种字符串类的模板特化允许用户获得字符串的哈希。

这些哈希等于对应 std::basic_string_view 类的哈希:若 S 是这些字符串类型之一, SV 是对应的字符串视图类型,而 s 是 S 类型的对象,则 std::hash< s >()(s) == std::hash()(SV(s)) 。
(C++17 起)

下列代码显示 string 上使用的散列函数的一种可能输出:

#include <iostream>
#include <string>
#include <string_view>
#include <functional>
#include <memory_resource>
using namespace std::literals;
int main()
    auto sv = "Stand back! I've got jimmies!"sv;
    std::string s(sv);
    std::pmr::string pmrs(sv); // 使用默认分配器
    std::cout << std::hash<std::string_view>{}(sv) << '\n';
    std::cout << std::hash<std::string>{}(s) << '\n';
    std::cout << std::hash<std::pmr::string>{}(pmrs) << '\n';

可能的输出:

3544599705012401047
3544599705012401047
3544599705012401047

哈希Hash的简介 Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散 代码如下:// CHash.h : header file #pragma once#include “sha1.h” #define        SIZE_OF_BUFFER         16000 class CHash{// Constructionpublic:    CString SHA1Hash(CString strHashFile);}; 代码如下:// CHash.cpp : implementation file//#include “stdafx.h”#include “CHash.h”#include <atlconv> CString CHash::SH 首先是标准库中的std::hash函数,对于内置的类型,标准库中是已经提供了的(包括std::string),但是若是自己自定义的类型想要求其哈希值的话,就需要自己定义其哈希值的求值方式。下面是简单示范 #include <map> #include <unordered_map> #include <unordered_set> #include <iostream> using std::cout; using std::endl; class My std::hash是实现了仿函数的类模板,根据传入不同数据类型T,获得哈希值。 返回值类型:size_t。 对于C/C++内置数据类型,已经实现了其哈希函数,自定义数据类型需要定义其哈希值的求值方式。C++中的哈希表是通过unordered_map实现的,它是一种关联容器,可以将键值对存储在其中。它的特点是快速查找,插入和删除,时间复杂度为O(1)。   C++ 11 中新加入的容器 unordered_map 和 unordered_set 底层都是哈希表实现的,那么对于内置类型,肯定是可以自动计算出 hash 值的,但是对于像 pair<int, int> 或者 vector<int> 这样的,或者自定义的类这种复杂类型,就不能自动算出 hash 值了,编译会提示 The C++ Standard doesn’t p... 什么是字符串Hash hash, 其实就是将一个东一映射成另一个东西, 类似Map的键值对. 那么字符串Hash, 其实就是: 构造一个数字使之唯一代表一个字符串. 但是为了将映射关系进行一一对应, 也就是, 一个字符串对应一个数字, 反之一个数字也对应一个字符串. 用字符串Hash的目的是: 如果我们要比较一个字符串, 我们不直接比较字符串, 而是比较它们对应映射的数字, 这样子就知道两个"子串"是否相等. 从而达到子串的Hash值的时间为O(1), 进而可以利用"空间换时间"来节省时间复杂度. // 把字符串看成是一个 P 进制数,每个字符的 ASCII 码对应数的一位 // ASCII 范围 0 - 127,最少 128 进制,经验上取 131 或 13331 冲突率低 const int N = 100010. 给定一个长度为 nn 的字符串,再给定 mm 个询问,每个询问包含四个整数 l1,r1,l2,r2l1,r1,l2,r2,请你判断 [l1,r1][l1,r1] 和 [l2,r2][l2,r2] 这两个区间所包含的字符串子串是否完全相同。我们想要求一个字符串中的两段是不是相等,我们可以把该字符串的每一段都变为一个特殊的数字,然后直接匹配就行,预处理之后匹配的时间复杂度就是o(1)的,那我们现在讲一下如何预处理。哈希函数将字符串映射到一个固定大小的整数,这个整数通常称为哈希值或哈希码。那什么是字符串哈希呢? std::hash的用途std::hashC++11提供的一元函数模板,用于向标准库提供返回数据类型T哈希值(hash value)的哈希函数(hash function)。 std::hash只是定义了一个一元操作符operator(),接受一个T类型的参数,返回一个size_t类型的哈希值, C++11为所有基本类型(basic types)都提供了特例化实现: