Variabele lengte hash.

Ik ben bezig met een "shared bus" en zit voorzichtig na te denken over een "discovery protocol". De devices hebben een uniek ID.

Nu kan ik gewoon afkijken naar wat "onewire" of RDM doet, maar "not invented here" dat kan natuurlijk beter. :-)

Diverse van dit soort protcollen doen bit-voor-bit het uniek id aflopen, maar als dan bijvoorbeeld op onewire je 30 tempsensors hebt uit dezelfde batch, dan krijg je dus de eerste dertig probes steeds "Ikke!!!!" van dertig slaves tegelijk te horen.

Voor terminologie heb ik halverwege dit bericht besloten Hx te gaan gebruiken voor de x-bits hash, dus H4 voor de vierbits hash.

Ik zat te denken. Als er nu een variable lengte hash zou zijn die haast cryptografisch anders wordt als je de lengte verandert, dan kan je een aantal dingen doen. Enerzijds, kan je als je 4 apparaten hebt scannen met zeg de 4bits hash en roepen: Iemand met H4==0? 1? 2? En dan is de kans ongeveer 50/50 dat je geen collisions krijgt. De host met wat meer geheugen kan onthouden wat er vorige scan aanhing, die individueel aanspreken en vragen om voorlopig effe stil te zijn en dan een probe doen met weinig bitjes om te weten te komen of er nog nieuwe apparaten zijn toegevoegd.

Wat ik ook een fijne eigenschap zou vinden is dat als je met een 4-bits probe een dikke collision van 5 apparaten op zeg H4=7 hebt, dat je dan beter kan scoren dan "2 groepen" als je besluit op de 5-bit-hash over te stappen. Dat laatste zou je dus krijgen als je gewoon een hash neemt waarvan je de laatste zoveel bitjes gebruikt.

Met "haast crytpografisch" bedoel ik: dat met een verschillende uniek id om mee te beginnen alle H5 = x apparaten egaal over de 16 mogelijke waardes van H4 verdeeld worden.

Misschien is binair zoeken niet eens zo inefficient en moet ik niet het wiel opnieuw willen uitvinden. Als niemand zo'n hash zou weten, dan zal dat het waarschijnlijk wel worden. Of evt. dat ik de hash truncate.

OK! Ik denk dat ik er een heb gevonden:
Hx (uniq) = truncate (x, MD5 (x + uniq))

Ik denk dat als ik dit goed krijg ik efficienter ben als er wel collisions zijn maar niet belachelijk veel.

Andere suggesties voor een hash zijn nog steeds welkom.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Als je bang bent voor veel "ikke", kun je dan niet gewoon aan de andere kant van het ID beginnen?

If you want to succeed, double your failure rate.
Arco

Special Member

Er zijn al zoveel protocols 'uitgevonden'... ;)
Bijv. UNI/O van Microchip: http://ww1.microchip.com/downloads/en/devicedoc/22076d.pdf

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Zomaar een idee:

Gebruik het ID om een LFSR random number generator te initialiseren. Draai die 10 slagen. Concatenate de uitkomst en ID.

Zo voorkom je dat devices uit dezelfde batch dicht op elkaar zitten in een binairy search.

Ander idee:

Laat devices op een enumeratie-request met een (random) delay reageren. En laat ze alleen reageren als er niet al niemand anders reageert. (dat kan onbetrouwbaar zijn afhankelijk van je onderliggende communicatie-techniek, YMMV)

Zo zal er waarschijnlijk steeds slechts een de eerste zijn, en die kun je dan enumereren, en vertellen dat ie verder zijn bek moet houden.

Voordeel van deze techniek is dat ie ook werkt zonder uniek ID.

Blurp: Thanks. Goed plan!

In plaats van lfsr initializeren wat mij betreft liever iets van CRC32 (uniq) | uniq gebruiken, De uniq ids zijn nu 96 bits, dus dan wordt dat samen een 128 bits. Mooi rond. :-)

Ook dat met delays dat kan: wacht een random veelvoud van 2* tijd om een byte te versturen. En dat reset je als je hoort dat iemand anders aan het antwoorden is. En met de "probe" kan je doorgeven: Vandaag is maximum veelvoud: 100. (als je bijvoorbeeld 10 devices verwacht).

2* byte tijd is wat mij betreft gekozen om 1 byte tijd de tijd te hebben om "hey, d'r is wat binnengekomen" te verwerken en daarop te reageren. Als je bij zo'n "hey iemand anders reageert" steeds je oude random blijft houden, dan krijg je dat als alle devices die < 5ms hadden gekozen ondertussen gerageerd hebben je 5ms extra gaat wachten voordat iedereen die 5.1 had gekozen gaat reageren. Kortom, je moet een nieuwe random verzinnen als er voor einde van je random een ander blijkt te reageren. Ohh!!!

Nog makkelijker: als iemand reageert voor jou, dan blaas je de hele "reageer op verzoek" af. De master verwerkt rustig dat iemand geantwoord heeft, probeert hem tot stilte te manen en stuurt dan op z'n gemak een volgende "stuur met maxrandom=xx een antwoord".

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op 15 augustus 2020 16:18:56 schreef rew:
Nu kan ik gewoon afkijken naar wat "onewire" of RDM doet, maar "not invented here" dat kan natuurlijk beter. :-)

Wie zegt dat? Veel is er al bedacht en de kans dat je het zelf beter kunt wordt met de jaren kleiner.

Diverse van dit soort protcollen doen bit-voor-bit het uniek id aflopen, maar als dan bijvoorbeeld op onewire je 30 tempsensors hebt uit dezelfde batch, dan krijg je dus de eerste dertig probes steeds "Ikke!!!!"

En precies na 30 probes heb je ze ook allemaal gevonden want per iteratie heb je er elke keer eentje te pakken, de devices met een niet dominant bit worden weggezeeft, daar is toch niks mis mee? En de 31-ste scan levert een ID van allemaal 1-nen, dus kun je dan stoppen.

Of stoor je je aan het feit dat als je een 96-bits ID hebt 31(nodes)x96 bits moet oversturen?

Dan kun je een 32 bits hash maken van je originele 96-bits ID bijvoorbeeld door domweg een SHA te gebruiken en er 32 bits af te knippen. Dat dan door de enumaratie/collision detection mangel heen halen.

De vraag is hoe je nu zeker weet dat er geen 2 devices dezelfde hash hebben? Zou alleen kunnen door nadat je de enumeratie gedaan hebt aan het device vragen: Stuur me een getal <magic> teug met een random delay en dan kijken of je ook dat nummer terug ziet. Als het verpest is of je krijgt 2 nummers dan heb je op die 2 nodes een collision gehad en moet je weer iets anders moeilijks gaan doen om dat op te lossen.

Maar alles bij elkaar gaat je dat denk ik geen verkorting (in tijd) van je enumeratie opleveren. Je wint aan het begin en verliest het weer aan een check later.

Wat is nu je echte doel?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Op 15 augustus 2020 17:51:38 schreef rew:
Nog makkelijker: als iemand reageert voor jou, dan blaas je de hele "reageer op verzoek" af. De master verwerkt rustig dat iemand geantwoord heeft, probeert hem tot stilte te manen en stuurt dan op z'n gemak een volgende "stuur met maxrandom=xx een antwoord".

Je kunt het heel simpel maken, zelfs zonder collision detect in de slaves. Als je N devices hebt, en de maxrandom tijd is veel groter van N*lengte antwoord dan is er een goede kans dat twee antwoorden niet tegelijk komen.

Oftewel:

  • Master stuurt enumeratie-request met max-respons tijd.
  • Slaves sturen na random delay tussen 0 en max respons antwoord.
  • Master enumereert alle slaves waarvan een goede respons ontvangen is, en maant ze verder tot stilte.
  • Master stuurt nieuwe request voor resterende slaves, net zo lang tot er geen respons meer komt.