Lektion 1Välja kollisionsstrategi för statiska kontexter: öppen adressering vs statisk separat kedjekoppling med arrayerJämför öppen adressering och statisk separat kedjekoppling för fast-minnessystem, analyserar cache-beteende, fragmentering, implementeringskomplexitet och riktlinjer för att välja kollisionsstrategi i inbyggda C-projekt.
Granskning av öppen adresseringsegenskaperGranskning av statisk separat kedjekopplingMinneslayout och cache-vänlighetKomplexitet och implementeringsinsatsRiktlinjer för strategivalLektion 2Minnes- och tidskomplexitet: dokumentera värsta och förväntade sonderingar, tabellbelastningsfaktor-rekommendationer för inbyggtAnalyserar minnes- och tidskomplexitet för statiska hashtabeller, dokumenterar värsta fall och förväntade sondantal, belastningsfaktgränser och praktiska storleksrekommendationer anpassade för inbyggda sensorapplikationer.
Värsta fall sondlängdsanalysFörväntade sonderingar under slumpmässig hasningBelastningsfaktorns inverkan på prestandaMinnesfotavtryck och tabellstorlekInbyggd-specifika inställningsriktlinjerLektion 3Säker pekarehantering: använda index istället för pekare, gränskontroller och undvika NULL-dereferenserTäcker säker pekarehantering i statiska hashtabeller genom att använda index istället för råa pekare, upprätthålla gränskontroller och designa API:er som förhindrar NULL-dereferenser och hängande referenser i C-kod.
Index vs pekare i statiska tabellerImplementera robusta gränskontrollerUndvika NULL- och hängande referenserKonvertera index till pekare säkertAPI-mönster som upprätthåller säkerhetLektion 4Öppen adresseringstekniker: linjär probning, kvadratisk probning, gravstenar och raderingssemantik utan dynamiskt minneDetaljerar öppen adressering i statiska tabeller, inklusive linjär och kvadratisk probning, gravstensmarkörer och raderingsregler som undviker dynamisk allokering samtidigt som sondkedjor och förutsägbar prestanda bevaras i C-implementeringar.
Linjär probning: algoritm och avvägningarKvadratisk probning: klustringbeteendeDesigna och använda gravstensmarkörerRaderingssemantik och sondkedjereparationUpptäcka full tabell och felmodiLektion 5Integration med cirkulär buffert: hålla senaste mätning och policyer för konsistens (skrivordning, tidsstämplar)Utforskar hur en statisk hashtabell samarbetar med en cirkulär buffert för att hålla de senaste sensormätningarna, definiera skrivordning, använda tidsstämplar för aktualitet och upprätthålla konsistens vid uppdateringar eller simultanliknande åtkomster.
Mappa sensor-ID till cirkulär buffertplatserLagra endast senaste mätning per sensorTidsstämpelfält och monoton ordningHantera overwrite- och wrap-around-fallKonsistensregler för simultanliknande åtkomstLektion 6init_table: sätta tomma markörer, initialisera frilistor eller gravstenarFörklarar init_table-ansvar, såsom att sätta tomma markörer, initialisera frilistor eller gravstenar, rensa metadata och säkerställa att tabellen startar i ett konsekvent, verifierbart tillstånd före första användning.
Välja och sätta tomma markörerInitialisera gravsten och tillståndsflaggorBygga initiala frilistsstrukturerNollställa eller sanera tabellminneValideringskontroller efter initialiseringLektion 7insert_or_update_reading: infoga, uppdatera, hantera full tabell och returkoderBeskriver insert_or_update_reading API:et, inklusive infogning, på-plats-uppdatering, hantera full tabell, returkoder och hur man integrerar kollisionshantering samtidigt som gränssnittet hålls enkelt och robust i C.
Funktionsprotototyp och parametervalInfogningsväg för nya sensor-ID:nUppdateringsväg för befintliga sensor-ID:nHantera full tabell och felreturerDesigna tydliga status- och felkoderLektion 8Designa hinkarrayen: tabellstorleksval, primtalstorlek och kompileringstidskonstanterBeskriver hur man designar hinkarrayen, inklusive val av tabellstorlek, primtal eller potens-av-två-storlek, kompileringstidskonstanter och avvägningar mellan minnesanvändning, hastighet och hashfunktionsenhetlighet.
Primtal vs potens-av-två tabellstorlekarRelatera tabellstorlek till nyckelkapacitetAnvända kompileringstidskonstanter i CBalansera minne och prestandaPlanera för framtida storleksjusteringarLektion 9Statisk kedjekoppling med arrayer: nodpool-design, nästa index och frilists-hantering i statiskt minneTäcker statisk separat kedjekoppling med arrayer, inklusive nodpool-layout, nästa index-länkar, frilists-hantering och hur man implementerar infogning, radering och traversering utan heap-allokering i begränsade miljöer.
Designa nodpool arraylayoutAnvända nästa index istället för pekareHantera frilista i statiskt minneInfogning och radering i statiska kedjorUpptäcka poolutmattning och felLektion 10Nyckel- och värderepresentationer: använda uint8_t sensor id och SensorReading kopieringssemantikFörklarar hur man representerar nycklar och värden med uint8_t sensor-ID:n och SensorReading-structar, med fokus på kopieringssemantik, justering, padding och undvikande av aliasing eller livstidsproblem i en statisk hashtabell.
Välja uint8_t för sensor-ID-nycklarDesigna SensorReading-structenKopieringssemantik vs pekarsemantikJustering, padding och struct-layoutValidera och normalisera sensor-ID:nLektion 11Hashfunktionsval för liten nyckelutrymme: identitet, multiplikativ och maskering för 0–255 id:nDiskuterar hashfunktioner för små uint8_t-nyckelutrymmen, inklusive identitetsmappning, multiplikativ hasning, maskering och hur man balanserar enkelhet, distributionskvalitet och beräkningskostnad för 0–255 sensor-ID:n.
Identitetshash för täta ID-intervallMultiplikativ hasning för uint8_t-nycklarBitmaskering och tabellindex-deriveringUndvika systematiska klustringsmönsterTesta distribution med provdataLektion 12find_reading_by_id: sondsekvenser, ej-funnet vs funnet svar och säkra kopieringsmönsterFokuserar på find_reading_by_id, inklusive sondsekvenser, skilja funnet från ej-funnet, säker kopiering av SensorReading ur tabellen och undvika odefinierat beteende eller exponering av gammal data i C.
Funktionssignatur och returmönsterImplementera sondsekvenser för uppslagHantera ej-funnet vs funnet resultatSäker kopiering av SensorReading-värdenUndvika gammal eller delvis skriven data