Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Microsoft har publicerat källkoden för standardbiblioteket, de flesta av C Runtime-biblioteket och andra Microsoft-bibliotek i många versioner av Visual Studio. Avsikten är att hjälpa dig att förstå bibliotekets beteende och att felsöka koden. En bieffekt av att publicera bibliotekets källkod är att vissa interna värden, datastrukturer och funktioner exponeras, även om de inte ingår i biblioteksgränssnittet. De har vanligtvis namn som börjar med två understreck, eller ett understreck följt av en stor bokstav, namn som C++-standarden reserverar för implementationer. Dessa värden, strukturer och funktioner är implementeringsinformation som kan ändras när biblioteken utvecklas över tid, och därför rekommenderar vi starkt att du inte tar några beroenden på dem. Om du gör det riskerar du icke-portabel kod och problem när du försöker migrera koden till nya versioner av biblioteken.
I de flesta fall nämner inte dokumentet Vad är nytt eller ändringar som bryter kompabilitet för varje version av Visual Studio ändringar i bibliotekens interna strukturer. Du ska trots allt inte påverkas av den här implementeringsinformationen. Men ibland är frestelsen att använda kod som du kan se i biblioteket för stor. I det här avsnittet beskrivs beroenden av interna CRT- eller standardbibliotek som du kanske har förlitat dig på och hur du uppdaterar koden för att ta bort dessa beroenden så att du kan göra den mer portabel eller migrera till nya versioner av biblioteket.
_Hash_seq
Den interna hash-funktionen std::_Hash_seq(const unsigned char *, size_t), som används för att implementera std::hash på vissa strängtyper, var synlig i de senaste versionerna av standardbiblioteket. Den här funktionen implementerade en FNV-1a-hash på en teckensekvens.
Om du vill ta bort det här beroendet har du ett par alternativ.
Om avsikten är att placera en
const char *sekvens i en osorterad container med hjälp av samma hashkodsmekanism sombasic_string, kan du göra det med hjälp av mallöverlagringenstd::hashsom tar enstd::string_view, som returnerar den hashkoden på ett portabelt sätt. Strängbibliotekskoden kanske eller kanske inte förlitar sig på användning av en FNV-1a-hash i framtiden, så det här är det bästa sättet att undvika ett beroende av en viss hashalgoritm.Om din avsikt är att generera en FNV-1a-hash över godtyckligt minne har vi gjort koden tillgänglig på GitHub på lagringsplatsen VCSamples i en fristående huvudfil, fnv1a.hpp, under en MIT-licens. Vi har också inkluderat en kopia här för din bekvämlighet. Du kan kopiera den här koden till en rubrikfil, lägga till rubriken i valfri kod som påverkas och sedan hitta och ersätta
_Hash_seqmedfnv1a_hash_bytes. Du får samma beteende som den interna implementeringen i_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);
}
Se även
Uppgradera projekt från tidigare versioner av Visual C++
Översikt över potentiella uppgraderingsproblem (Visual C++)
Uppgradera koden till Universal CRT