leebyron / spec-md

📖 Additions to Markdown for writing specification documents

Home Page:https://spec-md.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Infinite loop when the same Note is used 29 times or more

w0k3 opened this issue · comments

The algorithm giving unique IDs to Notes (and probably other elements) has a flaw - when the text of the Note is same the ID keeps growing in size, until it reaches 29th repetition, where it gets stuck in infinite loop.

test-files.zip

"Working" output for 28 notes:

<div id="note-3b064" class="spec-note">
<a href="#note-3b064">Note</a>
Note</div>
<div id="note-3b0649" class="spec-note">
<a href="#note-3b0649">Note</a>
Note</div>
<div id="note-3b0649c" class="spec-note">
<a href="#note-3b0649c">Note</a>
Note</div>
<div id="note-3b0649c7" class="spec-note">
<a href="#note-3b0649c7">Note</a>
Note</div>
<div id="note-3b0649c72" class="spec-note">
<a href="#note-3b0649c72">Note</a>
Note</div>
<div id="note-3b0649c726" class="spec-note">
<a href="#note-3b0649c726">Note</a>
Note</div>
<div id="note-3b0649c7265" class="spec-note">
<a href="#note-3b0649c7265">Note</a>
Note</div>
<div id="note-3b0649c72650" class="spec-note">
<a href="#note-3b0649c72650">Note</a>
Note</div>
<div id="note-3b0649c72650c" class="spec-note">
<a href="#note-3b0649c72650c">Note</a>
Note</div>
<div id="note-3b0649c72650c3" class="spec-note">
<a href="#note-3b0649c72650c3">Note</a>
Note</div>
<div id="note-3b0649c72650c31" class="spec-note">
<a href="#note-3b0649c72650c31">Note</a>
Note</div>
<div id="note-3b0649c72650c313" class="spec-note">
<a href="#note-3b0649c72650c313">Note</a>
Note</div>
<div id="note-3b0649c72650c313a" class="spec-note">
<a href="#note-3b0649c72650c313a">Note</a>
Note</div>
<div id="note-3b0649c72650c313a3" class="spec-note">
<a href="#note-3b0649c72650c313a3">Note</a>
Note</div>
<div id="note-3b0649c72650c313a35" class="spec-note">
<a href="#note-3b0649c72650c313a35">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357" class="spec-note">
<a href="#note-3b0649c72650c313a357">Note</a>
Note</div>
<div id="note-3b0649c72650c313a3573" class="spec-note">
<a href="#note-3b0649c72650c313a3573">Note</a>
Note</div>
<div id="note-3b0649c72650c313a35733" class="spec-note">
<a href="#note-3b0649c72650c313a35733">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338" class="spec-note">
<a href="#note-3b0649c72650c313a357338">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338d" class="spec-note">
<a href="#note-3b0649c72650c313a357338d">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dc" class="spec-note">
<a href="#note-3b0649c72650c313a357338dc">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcd" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcd">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdf" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdf">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdfb" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdfb">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdfb6" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdfb6">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdfb64" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdfb64">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdfb64e" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdfb64e">Note</a>
Note</div>
<div id="note-3b0649c72650c313a357338dcdfb64ec" class="spec-note">
<a href="#note-3b0649c72650c313a357338dcdfb64ec">Note</a>

The bug creeps here:

do {
          var hash = stableContentHash(content, hashSize++);
          var id = anchorize('note-' + hash);
        } while (options.biblio[id]);

Please don't use infinite loops and other brute force methods for such cases. stableContentHash uses createHash('md5') which of course never goes beyond 32 hexadecimal characters. :(

A simple, yet not perfect solution would be to salt the content with the hashSize. It makes the collisions far les likely to occour again and it wouldn't repeatedly calculate the same hash again and again just to trim it at different length.