Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A Microsoft publicou o código-fonte para a Biblioteca Padrão, a maioria da Biblioteca de Tempo de Execução C e outras bibliotecas da Microsoft em muitas versões do Visual Studio. A intenção é ajudá-lo a entender o comportamento da biblioteca e depurar seu código. Um efeito colateral da publicação do código-fonte da biblioteca é que alguns valores internos, estruturas de dados e funções são expostos, mesmo que não façam parte da interface da biblioteca. Eles geralmente têm nomes que começam com dois sublinhados, ou um sublinhado seguido de uma letra maiúscula, nomes que o padrão C++ reserva para implementações. Esses valores, estruturas e funções são detalhes de implementação que podem mudar à medida que as bibliotecas evoluem ao longo do tempo e, portanto, recomendamos fortemente que não se tome quaisquer dependências delas. Se o fizer, corre o risco de código não portátil e problemas ao tentar migrar o código para novas versões das bibliotecas.
Na maioria dos casos, o documento Novidades ou Alterações Significativas para cada versão do Visual Studio não menciona alterações nos internos da biblioteca. Afinal, você não deve ser afetado por esses detalhes de implementação. No entanto, às vezes a tentação de usar algum código que você pode ver dentro da biblioteca é muito grande. Este tópico discute as dependências em CRT ou bibliotecas padrão internas nas quais você pode ter confiado e como atualizar seu código para remover essas dependências para que você possa torná-lo mais portátil ou migrar para novas versões da biblioteca.
_Hash_seq
A função std::_Hash_seq(const unsigned char *, size_t)hash interna, usada para implementar std::hash em alguns tipos de cadeia de caracteres, era visível em versões recentes da Biblioteca Padrão. Esta função implementou um hash FNV-1a em uma sequência de caracteres.
Para remover essa dependência, você tem algumas opções.
Se a sua intenção é colocar uma
const char *sequência em um container não ordenado usando o mesmo mecanismo de código hash dobasic_string, você pode fazer isso usando o modelo de sobrecargastd::hashque utiliza umstd::string_view, o qual retorna esse código hash de forma portátil. O código da biblioteca de cadeias de caracteres pode ou não depender do uso de um hash FNV-1a no futuro, portanto, essa é a melhor maneira de evitar uma dependência de um algoritmo de hash específico.Se sua intenção é gerar um hash FNV-1a sobre memória arbitrária, disponibilizamos esse código no GitHub no repositório VCSamples em um arquivo de cabeçalho autônomo, fnv1a.hpp, sob uma licença MIT. Também incluímos uma cópia aqui para sua conveniência. Você pode copiar esse código em um arquivo de cabeçalho, adicionar o cabeçalho a qualquer código afetado e, em seguida, localizar e substituir
_Hash_seqporfnv1a_hash_bytes. Você obterá um comportamento idêntico à implementação interna no_Hash_seq.
/*
VCSamples
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <stddef.h>
inline size_t fnv1a_hash_bytes(const unsigned char * first, size_t count) {
#if defined(_WIN64)
static_assert(sizeof(size_t) == 8, "This code is for 64-bit size_t.");
const size_t fnv_offset_basis = 14695981039346656037ULL;
const size_t fnv_prime = 1099511628211ULL;
#else /* defined(_WIN64) */
static_assert(sizeof(size_t) == 4, "This code is for 32-bit size_t.");
const size_t fnv_offset_basis = 2166136261U;
const size_t fnv_prime = 16777619U;
#endif /* defined(_WIN64) */
size_t result = fnv_offset_basis;
for (size_t next = 0; next < count; ++next)
{
// fold in another byte
result ^= (size_t)first[next];
result *= fnv_prime;
}
return (result);
}
Ver também
Atualizando projetos de versões anteriores do Visual C++
Visão geral de possíveis problemas de atualização (Visual C++)
Atualize seu código para o CRT Universal