ãã®èšäºã§ã¯ãããããã¢ã®å³æžé€šã«ã€ããŠããããŠæãéèŠãªããšãšããŠããããåäœæããæ¹æ³ããããŠå®éã«ããããå³æžé€šã«ã€ããŠåŠã³ãŸãã
ã«ã€ã¹ã»ãã«ãã¹ã® ããããã¢å³æžé€šããã®åŒçšããå§ããŸãããã
åŒçšãå®å®-å³æžé€šãšåŒã°ããããšããã-巚倧ãªãããããç¡éã®æ°ã®å
è§åœ¢ã®ã®ã£ã©ãªãŒã§æ§æãããå¹
ã®åºãææ°å®€ãäœãã¬ãŒã«ã§å²ãŸããŠããŸãã åå
è§åœ¢ããã2ã€ã®äžéãš2ã€ã®äžéãèŠããŸã-ç¡éã«ã
ãã©ã€ãã©ãªã¯ãæ£ç¢ºãªäžå¿ãå
è§åœ¢ã®1ã€ã«ããããŒã«ã§ãããè¡šé¢ã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã åå
è§åœ¢ã®åå£ã«ã¯5ã€ã®æ£ããããåæ£ã«ã¯åã圢åŒã®32åã®æ¬ããããåæ¬ã«ã¯410ããŒãžãåããŒãžã«ã¯40è¡ãåè¡ã«ã¯çŽ80ã®é»æåããããŸãã æ¬ã®èã«æåããããŸããããããã¯ããŒãžãèšãããšãå®çŸ©ããããäºç¥ãããããŸããã ãã®ççŸã¯ããã€ãŠã¯äžå¯è§£ã§ããããã«æããŸãããã
ã©ã³ãã ãªå
è§åœ¢ãå
¥åããä»»æã®å£ã«ç§»åããä»»æã®æ£ãèŠãŠãæã奜ããªæ¬ãåããšãããªãã¯åæºããå¯èœæ§ãæãé«ããªããŸãã çµå±ã®ãšãããããªãã¯ããã§ã®äººçã®æå³ãç¥ãããšãæåŸ
ããŠããŸããããå¥åŠãªãã£ã©ã¯ã¿ãŒã®ã»ãããèŠãŸããã ãããããããªã«æ©ãåæºããªãã§ãã ããïŒ æ¬ã®ã»ãšãã©ã¯ã25æåã®ãã¹ãŠã®å¯èœãªããªãšãŒã·ã§ã³ã®çµã¿åããæ€çŽ¢ã§ãããããæå³ããããŸããïŒ
ãã«ã²ã¹ã圌ã®ã©ã€ãã©ãªã§äœ¿çšããã®ã¯ãã®ã¢ã«ãã¡ãããã§ãããèªè
ã¯ã©ã€ãã©ãªã«ä»»æã®æ°ã®æåãããããšãããããŸã ïŒã å³æžé€šã®äž»ãªæ³åã¯ã絶察ã«åäžã®æ¬ã2åãååšããªãããããã®æ°ã¯æéã§ãããå³æžé€šããã€ãã¯çµäºãããšãããã®ã§ãã ãã«ãã¹ã¯ãå³æžé€šãå®æçã§ãããšä¿¡ããŠããŸããã
åŒçšãæããææãšèããç§ã欺ããŠãããããããŸãããã人é¡-å¯äžã®ãã®-ã¯çµ¶æ»
ã«è¿ã¥ããŠãããå³æžé€šã¯çãæ®ãã ãããšèããŠããŸãïŒç
§ãããããç¡äººã®ãç¡éã®ã絶察ã«åããã貎éãªããªã¥ãŒã ã§æºãããã圹ã«ç«ãããå£ãããç¥ç§çã§ãã ç§ã¯ç¡éã«æžããŸããã ç§ã¯ãã®èšèãä¿®èŸåŠãžã®æããã¯èšå®ããŸããã§ããã äžçã¯ç¡éã ãšä»®å®ããã®ã¯çã«ããªã£ãŠãããšæããŸãã ãããéãããŠãããšèãã人ã¯ãå»äžãé段ãå
è§åœ¢ã®ã©ãããæªç¥ã®çç±ã§çµããããšãã§ããããšãèªããŠããŸã-ãã®ãããªä»®å®ã¯ã°ãããŠããŸãã å¢çãªãã«ãããæ³åãã人ã¯ãå¯èœãªæ¬ã®æ°ãéãããŠããããšãå¿ããŠããŸãã ãã®å€ãããããåé¡ã«å¯Ÿãããã®ãããªè§£æ±ºçãææ¡ããããšãæ¢ããŠããŸããã©ã€ãã©ãªã¯ç¡éã§ãããå®æçã§ãã æ°žé ã®æŸæµªè
ãããããæ¹åãžã®æ
ã«åºãå Žåã圌ã¯äœäžçŽãåŸã«åãæ¬ãåãæ··ä¹±ã§ç¹°ãè¿ãããããšã確èªããããšãã§ããŸãïŒç¹°ãè¿ããããšç§©åºã«ãªããŸã-秩åºïŒã ãã®åªé
ãªåžæã¯ç§ã®å€ç¬ãæããããŸããã
ãã³ã»ã³ã¹ãšæ¯èŒããŠã人ãå°ãªããšãäœããã®åœ¢ã§å
容ãç解ã§ããæ¬ã¯ã»ãšãã©ãããŸããããããã¯å³æžé€šã人ãçºæãããã¹ãŠã®ããã¹ããå«ããšããäºå®ãå€æŽããŸããã ããã«ãåäŸã®é ãããã·ã³ãã«ã®ã·ãŒã±ã³ã¹ã«ã¯æå³ããããã®ãšããã§ãªããã®ãèæ
®ããããšã«æ
£ããŠããŸãã å®éãã©ã€ãã©ãªã®ã³ã³ããã¹ãã§ã¯ããããã®éã«éãã¯ãããŸããã ããããçã«ããªã£ãŠãããã®ã®ããŒã»ã³ããŒãžã¯ã¯ããã«äœãããããèšèªãšåŒã³ãŸãã ããã¯äººã
ã®éã®ã³ãã¥ãã±ãŒã·ã§ã³ã®æ段ã§ãã ã©ã®èšèªã«ãæ°äžåã®åèªããå«ãŸããŠãããããã®ãã¡ã®70ïŒ
ã匷床ãç¥ã£ãŠãããããæžç±ã®çµã¿åããæ€çŽ¢ã®ã»ãšãã©ã解éã§ããªãããšãããããŸãã ãããŠã誰ãã
ã¢ããã§ãã¢ã«èŠãã¿ãã©ã³ãã ãªãã£ã©ã¯ã¿ãŒã®ã»ããã§ããé ãããæå³ãèŠãŸãã ããããããã¯
ã¹ãã¬ãã°ã©ãã£ã«ãšã£ãŠã¯è¯ãèãã§ãïŒ ããŠãç§ã¯ã³ã¡ã³ãã§ãã®ãããã¯ã«ã€ããŠè°è«ãç¶ããŠããŸãã
ãã®ã©ã€ãã©ãªã®å®è£
ã«é²ãåã«ãèå³æ·±ãäºå®ã«é©ããããŸãïŒLouis Borgesã®ããããã¢ã©ã€ãã©ãªãåäœæããå Žåããã®ããªã¥ãŒã ã¯ç®ã«èŠããUniverse 10 ^ 611338ïŒïŒïŒTimesã®ããªã¥ãŒã ãè¶
ãããããæåããŸããã ããã«å€§ããªã©ã€ãã©ãªã§äœãèµ·ãããã«ã€ããŠãç§ã¯èããããšããæãã§ãã
ã©ã€ãã©ãªã®å®è£
ã¢ãžã¥ãŒã«ã®èª¬æ
ã¡ãã£ãšãã玹ä»ã¯çµãããŸããã ããããããã¯æå³ããªãããã§ã¯ãããŸãããä»ãããªãã¯ããããã¢ã®å³æžé€šãã©ã®ãããªãã®ã§ããããç解ããèªãããšã¯ããèå³æ·±ãã ãã§ãã ããããç§ã¯å
ã®ã¢ã€ãã¢ããéããããŠãããŒãµã«ãã©ã€ãã©ãªãäœæãããã£ãã®ã§ããããã«ã€ããŠã¯åŸã§èª¬æããŸãã Node.jsã®äžã«JavaScriptãèšè¿°ããŸãããã©ã€ãã©ãªã¯äœãã§ããŸããïŒ
- ç®çã®ããã¹ãããã°ããèŠã€ããŠãã©ã€ãã©ãªå
ã®å Žæã衚瀺ããŸã
- æ¬ã®ã¿ã€ãã«ãå®çŸ©ãã
- é©åãªã¿ã€ãã«ã®æ¬ããã°ããèŠã€ãã
ããã«ãããã¯æ®éçãããªãã¡ ã©ã€ãã©ãªãã©ã¡ãŒã¿ã¯ãå¿
èŠã«å¿ããŠå€æŽã§ããŸãã ããŠãæåã«ã¢ãžã¥ãŒã«ã®ã³ãŒãå
šäœã衚瀺ãã詳现ã«åæãããããã©ã®ããã«æ©èœãããã確èªããããã€ãã®èšèã話ããšæããŸãã
Githubãªããžããªã¡ã€ã³ãã¡ã€ã«ã¯index.jsã§ãã©ã€ãã©ãªã®ããžãã¯å
šäœãèšè¿°ãããŠããŸãããã®ãã¡ã€ã«ã®å
容ã«ã€ããŠèª¬æããŸãã
let sha512 = require(`js-sha512`);
sha512ããã·ã¥
ã¢ã«ãŽãªãºã ãå®è£
ããã¢ãžã¥ãŒã«ãæ¥ç¶ããŸãã ããªãã«ã¯å¥åŠã«æãããããããŸããããããã§ãç§ãã¡ã«ãšã£ãŠæçšã§ãã
ã¢ãžã¥ãŒã«ã®åºåã¯äœã§ããïŒ é¢æ°ãè¿ããŸããåŒã³åºãã¯ãå¿
èŠãªãã¹ãŠã®ã¡ãœãããå«ãã©ã€ãã©ãªãªããžã§ã¯ããè¿ããŸãã ããã«è¿ãããšã¯ã§ããŸãããé¢æ°ã«ãã©ã¡ãŒã¿ãŒãæž¡ããŠãå¿
èŠãªãã©ã€ãã©ãªãååŸããå Žåãã©ã€ãã©ãªã®ç®¡çã¯ããã»ã©äŸ¿å©ã§ã¯ãããŸããã ããã«ãããããŠãããŒãµã«ãã©ã€ãã©ãªãäœæã§ããŸãã ES6ã¹ã¿ã€ã«ã§èšè¿°ããããšããã®ã§ãç§ã®ç¢å°é¢æ°ã¯ãã©ã¡ãŒã¿ãŒãšããŠãªããžã§ã¯ããåãå
¥ããŸãããã®åŸããªããžã§ã¯ãã¯å¿
èŠãªå€æ°ã«å解ãããŸãã
module.exports = ({ lengthOfPage = 4819, lengthOfTitle = 31, digs = '0123456789abcdefghijklmnopqrstuvwxyz', alphabet = ', .', wall = 5, shelf = 7, volume = 31, page = 421, } = {}) => {
次ã«ããã©ã¡ãŒã¿ãŒã調ã¹ãŸãã æšæºçãªæ°å€ãã©ã¡ãŒã¿ãŒãšããŠãç§ã¯çŽ æ°ãéžæããããšã«ããŸããã
- lengthOfPage-æ°ã1ããŒãžã®æåæ°ã ããã©ã«ãã¯4819ã§ãããã®æ°ãå æ°å解ãããšã61ãš79ãåŸãããŸãã79æåã®61è¡ããŸãã¯ãã®éã§ãããæåã®ãªãã·ã§ã³ã奜ã¿ãŸãã
- lengthOfTitle-æ°ãæ¬ã®ã¿ã€ãã«ã®ã¿ã€ãã«ã®æåæ°ã
- digs-æååããã®æååã®é·ãã«çããåºãæã€æ°åã®å¯èœãªæ°åã ãã®çªå·ã¯äœã®ããã§ããïŒ ããã«ã¯ã移åå
ã®å
è§åœ¢ã®çªå·ïŒèå¥åïŒãå«ãŸããŸãã ããã©ã«ãã§ã¯ãå°æåã®ã©ãã³èªãš0ã9ã®æ°åã§ãã ã»ãšãã©ã®ããã¹ãã¯ããã§ãšã³ã³ãŒãããããããæ°åãããïŒããŒãžäžã®æåæ°ã«å¿ããŠïŒã«ãªããŸãããæåããšã«åŠçãããŸãã
- ã¢ã«ãã¡ããã -æååãã©ã€ãã©ãªã«è¡šç€ºããæåã ãããã§æºããããŸãã ãã¹ãŠãæ£ããæ©èœããããã«ã¯ãã¢ã«ãã¡ãããã®æåæ°ã¯ãå
è§åœ¢ãèå¥ããæ°åã®å¯èœãªæ¡æ°ã®è¡ã®æåæ°ãšçãããªããã°ãªããŸããã
- wall-çªå·ãæ倧å£çªå·ãããã©ã«ã5
- ã·ã§ã«ã -çªå·ãæ倧ã·ã§ã«ãçªå·ãããã©ã«ã7
- ããªã¥ãŒã -çªå·ãæ倧ããã¯çªå·ãããã©ã«ãã¯31
- page-çªå·ãæ倧ããŒãžçªå·ãããã©ã«ã421
ã芧ã®ãšãããããã¯ã«ã€ã¹ã»ãã«ãã¹ã®æ¬ç©ã®ããããã¢å³æžé€šã«å°ã䌌ãŠããŸãã ããããç§ã¯ããããèŠãæ¹æ³ã«ãªãããšãã§ããããŠãããŒãµã«ãã©ã€ãã©ãªãäœæããããšããã§ã«äœåºŠãèšã£ãŠããŸãïŒãããã£ãŠã16é²æ°ã¯äœããã®æ¹æ³ã§è§£éããããšãã§ããŸããããšãã°ãç®çã®ã©ã€ãã©ãªãæ ŒçŽãããŠããå Žæã®èå¥åã ãæ
å ±ïŒã ããããã¢ã®å³æžé€šã¯ãã®äžã€ã«éããŸããã ããããããããã¹ãŠã«ã¯å€ãã®å
±éç¹ããããŸãã1ã€ã®ã¢ã«ãŽãªãºã ãããã©ãŒãã³ã¹ãæ
åœããŸãã
ããŒãžæ€çŽ¢ããã³è¡šç€ºã¢ã«ãŽãªãºã
ããã¢ãã¬ã¹ã«è¡ããšãããŒãžã®ã³ã³ãã³ãã衚瀺ãããŸãã åãã¢ãã¬ã¹ã«å床ã¢ã¯ã»ã¹ãããšãã³ã³ãã³ãã¯ãŸã£ããåãã«ãªããŸãã ã©ã€ãã©ãªã®ãã®ããããã£ã¯ãæ¬äŒŒä¹±æ°ãçæããã¢ã«ãŽãªãºã ãæäŸããŸã-
ç·åœ¢ååæ³ ã ã¢ãã¬ã¹ãçæããããã«ãã£ã©ã¯ã¿ãŒãéžæããå¿
èŠãããå ŽåããŸãã¯éã«ããŒãžã®ã³ã³ãã³ããäœæããå¿
èŠãããå Žåãããã圹ç«ã¡ãããŒãžæ°ãæ£ãªã©ãç©ç©ãšããŠäœ¿çšãããŸãã ç§ã®PRNGæ§æïŒm = 2 ^ 32ïŒ4294967296ïŒãa = 22695477ãc =1ããŸããå®è£
ã§ã¯ãæ°å€çæã®ååã®ã¿ãç·åœ¢ååæ³ããæ®ããæ®ãã¯å€æŽãããããšãè¿œå ããããšæããŸãã ããã°ã©ã ãªã¹ããããã«ç§»åããŸãã
ã³ãŒã module.exports = ({ lengthOfPage = 4819, lengthOfTitle = 31, digs = '0123456789abcdefghijklmnopqrstuvwxyz', alphabet = ', .', wall = 5, shelf = 7, volume = 31, page = 421, } = {}) => { let seed = 13;
ã芧ã®ããã«ãPRNGã°ã¬ã€ã³ã¯çªå·ãåä¿¡ãããã³ã«å€åããçµæã¯ããããåç
§ãã€ã³ãïŒã°ã¬ã€ã³ïŒã«çŽæ¥äŸåããŸããã°ã¬ã€ã³ã¯ãã®åŸãæ°å€ãèå³ãæã¡ãŸãã ïŒã¢ãã¬ã¹ãçæããããããŒãžã®ã³ã³ãã³ããååŸããŸãïŒ
getHashé¢æ°ã¯ãåç
§ãã€ã³ãã®çæã«åœ¹ç«ã¡ãŸãã ããã€ãã®ããŒã¿ããããã·ã¥ãååŸãã7æåãååŸãã10é²æ°ã·ã¹ãã ã«å€æããã ãã§å®äºã§ãïŒ
modé¢æ°ã¯ãïŒ
æŒç®åãšåãããã«åäœããŸãã ãã ããé
åœã<0ã®å ŽåïŒãã®ãããªç¶æ³ãçºçããå¯èœæ§ããããŸãïŒã
modé¢æ°ã¯ç¹å¥ãªæ§é ã®ããæ£ã®æ°ãè¿ããŸããã¢ãã¬ã¹ã§ããŒãžã®ã³ã³ãã³ããåä¿¡ãããšãã«
ã¢ã«ãã¡ãããæååããæåãæ£ããéžæããããã«ãããå¿
èŠã§ãã
ãããŠãæåŸã®ãã¶ãŒãã³ãŒãã¯è¿ãããã©ã€ãã©ãªãªããžã§ã¯ãã§ãã
ã³ãŒã return { wall, shelf, volume, page, lengthOfPage, lengthOfTitle, search(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), page = pad(`${(Math.random()* this.page + 1 ^ 0)}`, 3), locHash = getHash(`${wall}${shelf}${volume}${page}`), hex = ``, depth = Math.random() * (this.lengthOfPage - searchStr.length) ^ 0; for (let i = 0; i < depth; i++){ searchStr = alphabet[Math.random() * alphabet.length ^ 0] + searchStr; } seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]] || -1, rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}-${+page}`; }, searchExactly(text) { const pos = Math.random() * (this.lengthOfPage - text.length) ^ 0; return this.search(`${` `.repeat(pos)}${text}${` `.repeat(this.lengthOfPage - (pos + text.length))}`); }, searchTitle(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), locHash = getHash(`${wall}${shelf}${volume}`), hex = ``; searchStr = searchStr.substr(0, this.lengthOfTitle); searchStr = searchStr.length == this.lengthOfTitle ? searchStr : `${searchStr}${` `.repeat(this.lengthOfTitle - searchStr.length)}`; seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]], rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}`; }, getPage(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}${pad(addressArray[4], 3)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfPage) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfPage); }, getTitle(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfTitle) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfTitle); } };
æåã«ãåã«èª¬æããã©ã€ãã©ãªã®ããããã£ãæžã蟌ã¿ãŸãã mainé¢æ°ãåŒã³åºãããåŸã§ãå€æŽã§ããŸãïŒååãšããŠãã³ã³ã¹ãã©ã¯ã¿ãŒãšåŒã°ããŸãããç§ã®ã³ãŒãã¯ã©ã€ãã©ãªã®ã¯ã©ã¹å®è£
ã«åŒ±ã䌌ãŠããããããmainããšããåèªã«éå®ããŸãïŒã ããããããã®åäœã¯å®å
šã«é©åã§ã¯ãªããæè»ã§ãã 次ã«ãåã¡ãœããã調ã¹ãŸãã
æ€çŽ¢æ¹æ³
search(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random() * this.volume + 1 ^ 0)}`, 2), page = pad(`${(Math.random() * this.page + 1 ^ 0)}`, 3), locHash = getHash(`${wall}${shelf}${volume}${page}`), hex = ``, depth = Math.random() * (this.lengthOfPage - searchStr.length) ^ 0; for (let i = 0; i < depth; i++){ searchStr = alphabet[Math.random() * alphabet.length ^ 0] + searchStr; } seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]] || -1, rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}-${+page}`; }
ã©ã€ãã©ãªå
ã®
searchStræååã®ã¢ãã¬ã¹ãè¿ããŸãã ãããè¡ãã«ã¯ã
å£ãæ£ãããªã¥ãŒã ãããŒãžãã©ã³ãã ã«éžæã
ãŸã ã
ããªã¥ãŒã ãš
ããŒãžã«ããŒããåã蟌ãŸããç®çã®é·ãã«ãªããŸãã 次ã«ãããããæååã«é£çµããŠ
getHashé¢æ°ã«
æž¡ããŸãã çµæã®
locHashã¯éå§ç¹ãã€ãŸã ç©ç©ã
äºæž¬äžèœæ§ãé«ãããããã¢ã«ãã¡ãããã®æ¬äŒŒã©ã³ãã æåã§
searchStrã® æ·±ããè£ããã·ãŒã
ã·ãŒãã
locHashã«èšå®ã
ãŸã ã ãã®æ®µéã§ã¯ãã©ã€ã³ãã©ã®ããã«è£å®ãããã¯åé¡ã§ã¯ãªããããçµã¿èŸŒã¿ã®JavaScript PRNGã䜿çšã§ããŸããããã¯éèŠã§ã¯ãããŸããã æåŠããããšãã§ããŸãã®ã§ãèå³ã®ããçµæã¯åžžã«ããŒãžã®äžéšã«è¡šç€ºãããŸãã
æ®ã£ãŠããã®ã¯ãå
è§åœ¢ã®èå¥åãçæããããšã ãã§ãã
searchStrè¡ã®åæåã«å¯ŸããŠãã¢ã«ãŽãªãºã
ãå®è¡ããŸãã
- alphabetIndexesãªããžã§ã¯ãããã¢ã«ãã¡ãããã®ã€ã³ããã¯ã¹æåã®çªå·ãååŸããŸãã ããã§ãªãå Žåã¯-1ãè¿ããŸããããããçºçããå Žåã¯ééããªãäœãééã£ãããšãããŠããããšã«ãªããŸãã
- PRNGã䜿çšããŠã0ããã¢ã«ãã¡ãããã®é·ãã®ç¯å²ã§æ¬äŒŒä¹±æ°randãçæããŸãã
- æ°ããã€ã³ããã¯ã¹ãèšç®ããŸããããã¯ãã·ã³ãã«ã€ã³ããã¯ã¹ã®æ°ãšæ¬äŒŒä¹±æ°randã®åèšãšããŠèšç®ããã digsã®é·ããæ³ãšããŠé€ç®ãããŸãã
- ãããã£ãŠãå
è§åœ¢ã®èå¥åã®æ¡-newChar ïŒ digsããååŸïŒãååŸããŸããã
- newCharã16é²æ°èå¥å16é²æ°ã«è¿œå ããŸã
16é²æ°ã®çæãå®äºãããšãç®çã®æååãå«ãŸããŠããå Žæã®å®å
šãªã¢ãã¬ã¹ãè¿ããŸãã ã¢ãã¬ã¹ã³ã³ããŒãã³ãã¯ãã€ãã³ã§åºåãããŸãã
SearchExactlyã¡ãœãã
searchExactly(text) { const pos = Math.random() * (this.lengthOfPage - text.length) ^ 0; return this.search(`${` `.repeat(pos)}${text}${` `.repeat(this.lengthOfPage - (pos + text.length))}`); }
ãã®ã¡ãœããã¯ã
æ€çŽ¢ã¡ãœãããšåãããšããã¹ãŠè¡ããŸããããã¹ãŠã®ç©ºãã¹ããŒã¹ãåããŸãïŒ
æ€çŽ¢æåå
searchStrã
lengthOfPageæåã®é·ãã«ããŸãïŒã¹ããŒã¹ã ãã®ãããªããŒãžã衚瀺ãããšãããã¹ã以å€ã«ã¯äœã衚瀺ãããŠããªãããã«èŠããŸãã
SearchTitleã¡ãœãã
searchTitle(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), locHash = getHash(`${wall}${shelf}${volume}`), hex = ``; searchStr = searchStr.substr(0, this.lengthOfTitle); searchStr = searchStr.length == this.lengthOfTitle ? searchStr : `${searchStr}${` `.repeat(this.lengthOfTitle - searchStr.length)}`; seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]], rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}`; }
searchTitleã¡ãœããã¯ã
searchStrãšããæ¬ã®äœæãè¿ããŸãã å
éšã§ã¯ã
searchã«éåžžã«äŒŒãŠã
ãŸã ã éãã¯ã
locHashãèšç®ãããšãã«ãããŒãžã䜿çšããŠãã®ååãããã¯ã«ãã€ã³ãããªãããšã§ãã ããŒãžã«äŸåããã¹ãã§ã¯ãããŸããã
searchStrã¯
lengthOfTitleã«åãæšãŠãããå¿
èŠã«å¿ããŠã¹ããŒã¹ãåã蟌ãŸããŸãã åæ§ã«ãå
è§åœ¢ã®èå¥åãçæãããåä¿¡ããã¢ãã¬ã¹ãè¿ãããŸãã ä»»æã®ããã¹ãã®æ£ç¢ºãªã¢ãã¬ã¹ãæ€çŽ¢ãããšãã®ããã«ãããŒãžãååšããªãããšã«æ³šæããŠãã ããã ãããã£ãŠãããªããçºæããååã§æ¬ã®å
容ãç¥ãããå Žåã¯ãè¡ãããããŒãžã決ããŠãã ããã
GetPageã¡ãœãã
getPage(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}${pad(addressArray[4], 3)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfPage) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfPage); }
æ€çŽ¢æ¹æ³ã®å察ã ãã®ã¿ã¹ã¯ã¯ãããŒãžã®ã³ã³ãã³ããæå®ãããã¢ãã¬ã¹ã«æ»ãããšã§ãã ãããè¡ãã«ã¯ãåºåãæåã-ãã䜿çšããŠã¢ãã¬ã¹ãé
åã«å€æããŸãã ããã§ãå
è§åœ¢ã®èå¥åãå£ãæ£ãæ¬ãããŒãžãªã©ã®äœæã³ã³ããŒãã³ãã®é
åãã§ããŸããã
locHashã¯ã
æ€çŽ¢ã¡ãœããã§è¡ã£ãã®ãšåãæ¹æ³ã§èšç®ããŸãã ã¢ãã¬ã¹ãçæãããšããšåãçªå·ãååŸããŸãã ããã¯ãPRNGãåãæ°å€ãçæããããšãæå³ããŸãããœãŒã¹ããã¹ãã«å¯Ÿããå€æã®å¯éæ§ãä¿èšŒããã®ã¯ããã®åäœã§ãã èšç®ããã«ã¯ãå
è§åœ¢èå¥åã®åã·ã³ãã«ïŒäºå®äžãããã¯æ°åã§ãïŒã§ã¢ã«ãŽãªãºã ãå®è¡ããŸãã
- æåådigsã® ã€ã³ããã¯ã¹ãèšç®ããŸã ã digsIndexesããååŸããŸãã
- PRNGã䜿çšããŠã0ãããã®çŸããæ°åã®æ°åãå«ãæååã®é·ãã«çãã倧ããªæ°åã®æ°äœç³»ã®åºæ°ãŸã§ã®ç¯å²ã®æ¬äŒŒä¹±æ°randãçæããŸãã ãã¹ãŠãæããã§ãã
- ãœãŒã¹ããã¹ãnewIndexã®æåäœçœ®ãindexãšrandã®å·®ãšããŠèšç®ããã¢ã«ãã¡ãããã®é·ããæ³ãšããŠé€ç®ããŸãã å·®ãè² ã«ãªãå¯èœæ§ããããéåžžã®é€ç®ã¢ãžã¥ãã¯è² ã®ã€ã³ããã¯ã¹ãäžããŸãããããã¯ç§ãã¡ã«ã¯é©ããªããããã¢ãžã¥ãé€ç®ã®ä¿®æ£ããŒãžã§ã³ã䜿çšããŸãã ïŒäžèšã®åŒãã絶察å€ãååŸãããªãã·ã§ã³ãè©Šãããšãã§ããŸããããã¯è² ã®æ°ã®åé¡ã解決ããŸãããå®éã«ã¯ãŸã ãã¹ããããŠããŸããïŒ
- ããŒãžã®ããã¹ãã®æåã¯newCharã§ãã¢ã«ãã¡ãããããã€ã³ããã¯ã¹ãååŸããŸãã
- çµæã«ããã¹ãæåãè¿œå ããŸãã
ãã®æ®µéã§åŸãããçµæã¯åžžã«ããŒãžå
šäœãåããããã§ã¯ãªããããçŸåšã®çµæããæ°ããç²åãèšç®ããã¢ã«ãã¡ãããã®æåã§ç©ºã®ã¹ããŒã¹ãåããŸãã PRNGã¯ãã·ã³ãã«ã®éžæã«åœ¹ç«ã¡ãŸãã
ããã«ãããããŒãžã³ã³ãã³ãã®èšç®ãå®äºããæ倧é·ã«ããªãã³ã°ããããšãå¿ããã«ããããè¿ããŸãã ãããããå
¥åã¢ãã¬ã¹ã§å
è§åœ¢ã®èå¥åãäžåœã«å€§ããå¯èœæ§ããããŸãã
GetTitleã¡ãœãã
getTitle(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfTitle) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfTitle); }
ãŸããç©èªã¯åãã§ãã PRNGã°ã¬ã€ã³ã®èšç®ã§ããŒãžçªå·ãèæ
®ããããçµæãããã¯åã®æ倧é·
-lengthOfTitleã«è¿œå ããŠããªãã³ã°ããå Žåã«ã®ã¿ãåã®æ¹æ³ã®èª¬æãèªãããšãæ³åããŠãã ããã
ã©ã€ãã©ãªãäœæããããã®ãã¹ãã¢ãžã¥ãŒã«
ããããã¢ã®ãããªã©ã€ãã©ãªã®åäœåçãæ€èšŒããåŸãå®éã«ãã¹ãŠãè©ŠããŠã¿ãŸãããã Louis Borgesã«ãã£ãŠäœæãããæ§æã«å¯èœãªéãè¿ãæ§æã䜿çšããŸãã åçŽãªãã¬ãŒãºãhabr.comããæ€çŽ¢ããŸãã
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`,
å®è¡ãçµæïŒ

çŸæç¹ã§ã¯ãäœãæäŸããŠããŸããã ãããããã®ã¢ãã¬ã¹ã®åŸãã«é ãããŠãããã®ãèŠã€ããŸãããïŒ ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`,
çµæïŒ

ç§ãã¡ã¯æ¢ããŠãããã®ãç¡æ°ã®ç¡æå³ãªïŒè³ããïŒããŒãžã§èŠã€ããŸããïŒ
ããããããã¯ãã®ãã¬ãŒãºãååšããå¯äžã®å Žæããã¯ã»ã©é ãã§ãã 次åããã°ã©ã ãèµ·åãããšãå¥ã®ã¢ãã¬ã¹ãçæãããŸãã å¿
èŠã«å¿ããŠãä¿åããŠäœæ¥ããããšãã§ããŸãã äž»ãªããšã¯ãããŒãžã®ã³ã³ãã³ããå€æŽãããªãããšã§ãã ãã¬ãŒãºã®ããæ¬ã®ã¿ã€ãã«ãèŠãŠã¿ãŸãããã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`,
æ¬ã®ã¿ã€ãã«ã¯æ¬¡ã®ãããªãã®ã§ãã

æ£çŽãªãšãããããŸãé
åçã§ã¯ãããŸããã 次ã«ãã¿ã€ãã«ã«ãã¬ãŒãºãå«ãæ¬ãèŠã€ããŸãããã
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`,

ããã§ããã®ã©ã€ãã©ãªã®äœ¿çšæ¹æ³ãç解ã§ããŸããã å®å
šã«ç°ãªãã©ã€ãã©ãªãäœæããå¯èœæ§ã瀺ããŸãããã ããã§1ãš0ã§åããããåããŒãžã¯100æåã«ãªããã¢ãã¬ã¹ã¯16é²æ°ã«ãªããŸãã ã¢ã«ãã¡ãããã®é·ããšç§ãã¡ã®å€§ããªæ°åã®æ°ååã®çããæ¡ä»¶ãå®ãããšãå¿ããªãã§ãã ããã ããšãã°ãã10101100101010111001000000ããæ€çŽ¢ããŸãã ç§ãã¡ã¯èŠãŸãïŒ
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 100, alphabet: `1010101010101010`,

å®å
šã«äžèŽãããã®ãæ¢ããŠã¿ãŸãããã ãããè¡ãã«ã¯ãå€ãäŸã«æ»ããã³ãŒãã§
libraryofbabel.searchã
libraryofbabel.searchExactlyã«çœ®ãæã
ãŸã ã
const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`,

ãããã«
ã©ã€ãã©ãªæäœã¢ã«ãŽãªãºã ã®èª¬æãèªãã åŸãããããããã¯äžçš®ã®æ¬ºceptionã§ãããšãã§ã«æšæž¬ããŠããã§ãããã
ã©ã€ãã©ãªã§æå³ã®ãããã®ãæ¢ããšãããã¯åã«å¥ã®åœ¢åŒã§ãšã³ã³ãŒããããå¥ã®åœ¢åŒã§è¡šç€ºãããŸããããããéåžžã«çŸããä»äžãã£ãŠããã®ã§ãå
è§åœ¢ã®ãããã®ç¡éã®åãä¿¡ãå§ããŸããå®éãããã¯æ°åŠçæœè±¡åã«éããŸããããããããã®ã©ã€ãã©ãªã§ã¯ã絶察ã«äœã§ããäœã§ãèŠã€ããããšãã§ãããšããäºå®ã¯çå®ã§ãããŸããæåã®ã©ã³ãã ã·ãŒã±ã³ã¹ãçæããå Žåãé
ããæ©ããã絶察ã«ä»»æã®ããã¹ããååŸã§ããããšãäºå®ã§ãããã®ãããã¯ã®ç解ãæ·±ããããã«ãç¡éã®ç¿ã®å®çãç 究ã§ããŸããã©ã€ãã©ãªãå®è£
ããããã®ãã®ä»ã®ãªãã·ã§ã³ãèãåºãããšãã§ããŸããæå·åã¢ã«ãŽãªãºã ã䜿çšããŸããæå·åããã¹ãã¯ãå
æ¬çãªã©ã€ãã©ãªã®ã¢ãã¬ã¹ã«ãªããŸãã埩å·å-ããŒãžã³ã³ãã³ãã®ååŸããŸãã¯å€åè©Šãbase64ãmïŒã©ã€ãã©ãªã®äœ¿çšäŸãšããŠã¯ããã®å Žæã®ããã€ãã«ãã¹ã¯ãŒããä¿åããããšããããŸããå¿
èŠãªæ§æãäœæããã©ã€ãã©ãªå
ã®ãã¹ã¯ãŒãã®å ŽæãèŠã€ããŸãïŒã¯ãããã§ã«ååšããŸãããã¹ã¯ãŒããçºæããã®ã¯ããªãã ãšæããŸãããïŒïŒãã¢ãã¬ã¹ãä¿åããŸãããããŠä»ãäœããã®ãã¹ã¯ãŒããèŠã€ããå¿
èŠããããšãã¯ãã©ã€ãã©ãªã§ãããèŠã€ããŠãã ãããããããæ»æè
ã¯ã©ã€ãã©ãªã®èšå®ãèŠã€ããŠèªåã®ã¢ãã¬ã¹ã䜿çšããã ããªã®ã§ããã®ã¢ãããŒãã¯å±éºã§ãããããã圌ãèŠã€ãããã®ã®æå³ãç¥ããªãå Žåãããªãã®ããŒã¿ã圌ã«å±ãå¯èœæ§ã¯äœãã§ãããããŠããã¹ã¯ãŒããä¿åãããã®ãããªæ¹æ³ã¯äž»æµã§ããïŒããããããããå ŽæããããŸãããã®ã¢ã€ãã¢ã䜿çšããŠãããŸããŸãªãã©ã€ãã©ãªããäœæã§ããŸãããã£ã©ã¯ã¿ãŒã ãã§ãªããåèªå
šäœãããã«ã¯é³ãŸã§å埩ããããšãã§ããŸãïŒäººéã®ç¥èŠã«å©çšå¯èœãªããããé³ã絶察ã«èŽãããšãã§ããå ŽæããŸãã¯ããçš®ã®æãèŠã€ããå Žæãæ³åããŠãã ãããå°æ¥ãç§ã¯ééããªããããå®è£
ããããšããŸãããã·ã¢èªã®WebããŒãžã§ã³ã¯ããããå
¥æã§ããä»®æ³ãµãŒããŒã«ãããã€ãããŸããç§ã¯ãããããã¢å³æžé€šã§ã®äººçã®æå³ããããªããäœããããã®ã«ã€ããŠã®æ¥œããæ€çŽ¢ããã¹ãŠç¥ããŸãããããããªãïŒ :)