[{"data":1,"prerenderedAt":841},["ShallowReactive",2],{"navigation_docs":3,"-guide-search":244,"-guide-search-surround":836},[4,52],{"title":5,"path":6,"stem":7,"children":8,"icon":51},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Hashing","\u002Fguide\u002Fhashing","1.guide\u002F02.hashing",{"title":16,"path":17,"stem":18},"HMAC and verify","\u002Fguide\u002Fverify","1.guide\u002F03.verify",{"title":20,"path":21,"stem":22},"Salted KDFs","\u002Fguide\u002Fkdf","1.guide\u002F04.kdf",{"title":24,"path":25,"stem":26},"Length extension","\u002Fguide\u002Fextend","1.guide\u002F05.extend",{"title":28,"path":29,"stem":30},"Identify a hash","\u002Fguide\u002Fidentify","1.guide\u002F06.identify",{"title":32,"path":33,"stem":34},"Search for a transform","\u002Fguide\u002Fsearch","1.guide\u002F07.search",{"title":36,"path":37,"stem":38},"CLI","\u002Fguide\u002Fcli","1.guide\u002F08.cli",{"title":40,"path":41,"stem":42},"Agents","\u002Fguide\u002Fagents","1.guide\u002F09.agents",{"title":44,"path":45,"stem":46},"Custom algorithms","\u002Fguide\u002Fcustom","1.guide\u002F10.custom",{"title":48,"path":49,"stem":50},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F11.playground","i-lucide-book-open",{"title":53,"path":54,"stem":55,"children":56,"icon":243},"Algorithms","\u002Falgorithms","2.algorithms\u002F00.index",[57,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239],{"title":58,"path":54,"stem":55},"Every algorithm",{"title":60,"path":61,"stem":62},"SHA-256","\u002Falgorithms\u002Fsha256","2.algorithms\u002F01.sha256",{"title":64,"path":65,"stem":66},"SHA-384","\u002Falgorithms\u002Fsha384","2.algorithms\u002F02.sha384",{"title":68,"path":69,"stem":70},"SHA-512","\u002Falgorithms\u002Fsha512","2.algorithms\u002F03.sha512",{"title":72,"path":73,"stem":74},"SHA-224","\u002Falgorithms\u002Fsha224","2.algorithms\u002F04.sha224",{"title":76,"path":77,"stem":78},"SHA-512\u002F224","\u002Falgorithms\u002Fsha512-224","2.algorithms\u002F05.sha512-224",{"title":80,"path":81,"stem":82},"SHA-512\u002F256","\u002Falgorithms\u002Fsha512-256","2.algorithms\u002F06.sha512-256",{"title":84,"path":85,"stem":86},"SHA-512Half","\u002Falgorithms\u002Fsha512-half","2.algorithms\u002F07.sha512-half",{"title":88,"path":89,"stem":90},"SHA3-256","\u002Falgorithms\u002Fsha3-256","2.algorithms\u002F08.sha3-256",{"title":92,"path":93,"stem":94},"SHA3-512","\u002Falgorithms\u002Fsha3-512","2.algorithms\u002F09.sha3-512",{"title":96,"path":97,"stem":98},"Keccak-256","\u002Falgorithms\u002Fkeccak256","2.algorithms\u002F10.keccak256",{"title":100,"path":101,"stem":102},"BLAKE2b","\u002Falgorithms\u002Fblake2b","2.algorithms\u002F11.blake2b",{"title":104,"path":105,"stem":106},"BLAKE2b-256","\u002Falgorithms\u002Fblake2b-256","2.algorithms\u002F12.blake2b-256",{"title":108,"path":109,"stem":110},"BLAKE2b-224","\u002Falgorithms\u002Fblake2b-224","2.algorithms\u002F13.blake2b-224",{"title":112,"path":113,"stem":114},"BLAKE2s","\u002Falgorithms\u002Fblake2s","2.algorithms\u002F14.blake2s",{"title":116,"path":117,"stem":118},"BLAKE3","\u002Falgorithms\u002Fblake3","2.algorithms\u002F15.blake3",{"title":120,"path":121,"stem":122},"BLAKE-256","\u002Falgorithms\u002Fblake256","2.algorithms\u002F16.blake256",{"title":124,"path":125,"stem":126},"RIPEMD-160","\u002Falgorithms\u002Fripemd160","2.algorithms\u002F17.ripemd160",{"title":128,"path":129,"stem":130},"RIPEMD-320","\u002Falgorithms\u002Fripemd320","2.algorithms\u002F18.ripemd320",{"title":132,"path":133,"stem":134},"HASH160","\u002Falgorithms\u002Fhash160","2.algorithms\u002F19.hash160",{"title":136,"path":137,"stem":138},"HASH256","\u002Falgorithms\u002Fhash256","2.algorithms\u002F20.hash256",{"title":140,"path":141,"stem":142},"Whirlpool","\u002Falgorithms\u002Fwhirlpool","2.algorithms\u002F21.whirlpool",{"title":144,"path":145,"stem":146},"MD5","\u002Falgorithms\u002Fmd5","2.algorithms\u002F22.md5",{"title":148,"path":149,"stem":150},"MD4","\u002Falgorithms\u002Fmd4","2.algorithms\u002F23.md4",{"title":152,"path":153,"stem":154},"MD2","\u002Falgorithms\u002Fmd2","2.algorithms\u002F24.md2",{"title":156,"path":157,"stem":158},"NTLM","\u002Falgorithms\u002Fntlm","2.algorithms\u002F25.ntlm",{"title":160,"path":161,"stem":162},"SHA-1","\u002Falgorithms\u002Fsha1","2.algorithms\u002F26.sha1",{"title":164,"path":165,"stem":166},"SHA-0","\u002Falgorithms\u002Fsha0","2.algorithms\u002F27.sha0",{"title":168,"path":169,"stem":170},"RIPEMD-128","\u002Falgorithms\u002Fripemd128","2.algorithms\u002F28.ripemd128",{"title":172,"path":173,"stem":174},"RIPEMD-256","\u002Falgorithms\u002Fripemd256","2.algorithms\u002F29.ripemd256",{"title":176,"path":177,"stem":178},"HAVAL","\u002Falgorithms\u002Fhaval","2.algorithms\u002F30.haval",{"title":180,"path":181,"stem":182},"Tiger","\u002Falgorithms\u002Ftiger","2.algorithms\u002F31.tiger",{"title":184,"path":185,"stem":186},"CRC-32","\u002Falgorithms\u002Fcrc32","2.algorithms\u002F32.crc32",{"title":188,"path":189,"stem":190},"CRC-64","\u002Falgorithms\u002Fcrc64","2.algorithms\u002F33.crc64",{"title":192,"path":193,"stem":194},"CRC-24","\u002Falgorithms\u002Fcrc24","2.algorithms\u002F34.crc24",{"title":196,"path":197,"stem":198},"CRC-16\u002FXMODEM","\u002Falgorithms\u002Fcrc16-xmodem","2.algorithms\u002F35.crc16-xmodem",{"title":200,"path":201,"stem":202},"Adler-32","\u002Falgorithms\u002Fadler32","2.algorithms\u002F36.adler32",{"title":204,"path":205,"stem":206},"xxHash","\u002Falgorithms\u002Fxxhash","2.algorithms\u002F37.xxhash",{"title":208,"path":209,"stem":210},"FNV-1a (64-bit)","\u002Falgorithms\u002Ffnv1a","2.algorithms\u002F38.fnv1a",{"title":212,"path":213,"stem":214},"scrypt","\u002Falgorithms\u002Fscrypt","2.algorithms\u002F39.scrypt",{"title":216,"path":217,"stem":218},"PBKDF2","\u002Falgorithms\u002Fpbkdf2","2.algorithms\u002F40.pbkdf2",{"title":220,"path":221,"stem":222},"HKDF","\u002Falgorithms\u002Fhkdf","2.algorithms\u002F41.hkdf",{"title":224,"path":225,"stem":226},"EVP_BytesToKey","\u002Falgorithms\u002Fevp-bytestokey","2.algorithms\u002F42.evp-bytestokey",{"title":228,"path":229,"stem":230},"Argon2id","\u002Falgorithms\u002Fargon2id","2.algorithms\u002F43.argon2id",{"title":232,"path":233,"stem":234},"Argon2i","\u002Falgorithms\u002Fargon2i","2.algorithms\u002F44.argon2i",{"title":236,"path":237,"stem":238},"Argon2d","\u002Falgorithms\u002Fargon2d","2.algorithms\u002F45.argon2d",{"title":240,"path":241,"stem":242},"bcrypt","\u002Falgorithms\u002Fbcrypt","2.algorithms\u002F46.bcrypt","i-lucide-library",{"id":245,"title":32,"body":246,"description":828,"extension":829,"links":830,"meta":831,"navigation":303,"path":33,"seo":833,"stem":34,"__hash__":835},"docs\u002F1.guide\u002F07.search.md",{"type":247,"value":248,"toc":819},"minimark",[249,254,258,266,396,399,403,406,444,462,476,479,483,494,497,507,511,514,623,626,636,646,650,653,701,745,749,752,798,801,805,815],[250,251,253],"h2",{"id":252},"which-words-made-this-hash","Which words made this hash?",[255,256,257],"p",{},"Puzzles love this trick. Take a few answers, glue them together, hash the lot. The digest is your password. You found the words. Great. In which order, though? Joined with what? Lowercase? Hashed twice?",[255,259,260,261,265],{},"Nobody wants to write that loop again. ",[262,263,264],"code",{},"searchDigest"," takes the words and the digest and tries everything:",[267,268,273],"pre",{"className":269,"code":270,"language":271,"meta":272,"style":272},"language-ts shiki shiki-themes hashes hashes hashes","import { searchDigest } from \"@agntn\u002Fhashes\";\n\nconst found = searchDigest(\n  Uint8Array.fromHex(\"250f37726d6862939f723edc4f993fde9d33c6004aab4f2203d9ee489d61ce4c\"),\n  { words: [\"heisenbergsuncertaintyprinciple\", \"giveitjustonesecond\", \"jacquefresco\"] },\n);\nfound.recipe;\n\u002F\u002F { words: [\"jacquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\"],\n\u002F\u002F   joiner: \"\", case: \"as-is\", algorithm: \"sha256\", rounds: 1,\n\u002F\u002F   input: \"jacquefrescogiveitjustonesecondheisenbergsuncertaintyprinciple\" }\n","ts","",[262,274,275,298,305,324,342,365,371,377,384,390],{"__ignoreMap":272},[276,277,280,284,288,291,295],"span",{"class":278,"line":279},"line",1,[276,281,283],{"class":282},"skH_V","import",[276,285,287],{"class":286},"s38Sx"," { searchDigest } ",[276,289,290],{"class":282},"from",[276,292,294],{"class":293},"shU9J"," \"@agntn\u002Fhashes\"",[276,296,297],{"class":286},";\n",[276,299,301],{"class":278,"line":300},2,[276,302,304],{"emptyLinePlaceholder":303},true,"\n",[276,306,308,311,314,317,321],{"class":278,"line":307},3,[276,309,310],{"class":282},"const",[276,312,313],{"class":286}," found ",[276,315,316],{"class":282},"=",[276,318,320],{"class":319},"sK71F"," searchDigest",[276,322,323],{"class":286},"(\n",[276,325,327,330,333,336,339],{"class":278,"line":326},4,[276,328,329],{"class":286},"  Uint8Array.",[276,331,332],{"class":319},"fromHex",[276,334,335],{"class":286},"(",[276,337,338],{"class":293},"\"250f37726d6862939f723edc4f993fde9d33c6004aab4f2203d9ee489d61ce4c\"",[276,340,341],{"class":286},"),\n",[276,343,345,348,351,354,357,359,362],{"class":278,"line":344},5,[276,346,347],{"class":286},"  { words: [",[276,349,350],{"class":293},"\"heisenbergsuncertaintyprinciple\"",[276,352,353],{"class":286},", ",[276,355,356],{"class":293},"\"giveitjustonesecond\"",[276,358,353],{"class":286},[276,360,361],{"class":293},"\"jacquefresco\"",[276,363,364],{"class":286},"] },\n",[276,366,368],{"class":278,"line":367},6,[276,369,370],{"class":286},");\n",[276,372,374],{"class":278,"line":373},7,[276,375,376],{"class":286},"found.recipe;\n",[276,378,380],{"class":278,"line":379},8,[276,381,383],{"class":382},"scIB-","\u002F\u002F { words: [\"jacquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\"],\n",[276,385,387],{"class":278,"line":386},9,[276,388,389],{"class":382},"\u002F\u002F   joiner: \"\", case: \"as-is\", algorithm: \"sha256\", rounds: 1,\n",[276,391,393],{"class":278,"line":392},10,[276,394,395],{"class":382},"\u002F\u002F   input: \"jacquefrescogiveitjustonesecondheisenbergsuncertaintyprinciple\" }\n",[255,397,398],{},"That's the OpenSSL password of GSMG phase 3.2. Three words, no spaces, SHA-256 in hex. Done before you could type the second guess.",[250,400,402],{"id":401},"what-does-it-try","What does it try?",[255,404,405],{},"Every subset of the words, the smallest first, in every order. Each word at most once. Then:",[407,408,409,417,423,434],"ul",{},[410,411,412,416],"li",{},[413,414,415],"strong",{},"Joiners."," Nothing, a space, a comma, a line feed. Or your own list.",[410,418,419,422],{},[413,420,421],{},"Cases."," As given, all lowercase, all uppercase, each word capitalized.",[410,424,425,428,429,433],{},[413,426,427],{},"Algorithms."," Every fixed-length digest as long as yours. A 32-byte target gets SHA-256, SHA3-256, Keccak-256, BLAKE3 and the rest of its size. A 20-byte one gets SHA-1, SHA-0, RIPEMD-160 and HASH160. A 4-byte one gets CRC-32, its BZIP2 variant and XXH32 too, the same readings ",[430,431,432],"a",{"href":29},"identify"," lists.",[410,435,436,439,440,443],{},[413,437,438],{},"Rounds."," Up to ",[262,441,442],{},"rounds"," deep. Each round after the first hashes the digest's bytes, its lowercase hex or its uppercase hex.",[255,445,446,447,450,451,453,454,457,458,461],{},"Two cases that give the same text count once. ",[262,448,449],{},"alpha"," lowercased is still ",[262,452,449],{},", so it's hashed once. A word listed twice is an error, not a quiet double. So are ",[262,455,456],{},"Moon"," and ",[262,459,460],{},"moon"," with lowercase on the list: one of them is enough.",[255,463,464,465,468,469,471,472,475],{},"One overlap stays. With no joiner, ",[262,466,467],{},"ab"," alone and ",[262,470,430],{}," plus ",[262,473,474],{},"b"," make the same text, so it's hashed twice. Cheap, and the count includes it up front.",[255,477,478],{},"The KDFs stay out. They need a salt, and then it isn't a transform of your words anymore.",[250,480,482],{"id":481},"how-long-will-it-take","How long will it take?",[255,484,485,486,489,490,493],{},"You know before it starts. ",[262,487,488],{},"total"," is the exact number of hashes the scope holds, counted without listing them. ",[262,491,492],{},"onProgress"," hears it first, then the running count every 100,000 hashes.",[255,495,496],{},"Each hash costs a couple of microseconds. Five lowercase words make 3,855 texts, and every algorithm of the digest's length hashes each one. Gone in a blink. Nine words make 11,836,827 texts. That's minutes, not seconds. Order matters, and nine words have a lot of orders.",[255,498,499,502,503,506],{},[262,500,501],{},"limit"," stops it early, and ",[262,504,505],{},"stopped"," tells you it did. The first match ends the search either way.",[250,508,510],{"id":509},"three-hashes-one-handful-of-words","Three hashes, one handful of words?",[255,512,513],{},"Puzzles rarely stop at one digest. Searching them one at a time builds the same texts again and pays for every hash again. Why bother? Pass a list:",[267,515,517],{"className":269,"code":516,"language":271,"meta":272,"style":272},"const found = searchDigest(\n  [\n    \"a18caf4d9bca26b5d8594c058648dad73a863ac2bc8ee1db43f60d7db03ff869\",\n    \"0c872254d5f9982d78a14eb0ba09cbb2\",\n    \"4f4a9410ffcdf895c4adb880659e9b5c0dd1f23a30790684340b3eaacb045398\",\n  ].map((hex) => Uint8Array.fromHex(hex)),\n  { words: [\"alpha\", \"beta\", \"gamma\"] },\n);\nfound.items.map((item) => item.recipe?.input);\n\u002F\u002F [\"gamma alpha\", \"Beta,Gamma\", undefined]\n",[262,518,519,531,536,544,551,558,580,599,603,618],{"__ignoreMap":272},[276,520,521,523,525,527,529],{"class":278,"line":279},[276,522,310],{"class":282},[276,524,313],{"class":286},[276,526,316],{"class":282},[276,528,320],{"class":319},[276,530,323],{"class":286},[276,532,533],{"class":278,"line":300},[276,534,535],{"class":286},"  [\n",[276,537,538,541],{"class":278,"line":307},[276,539,540],{"class":293},"    \"a18caf4d9bca26b5d8594c058648dad73a863ac2bc8ee1db43f60d7db03ff869\"",[276,542,543],{"class":286},",\n",[276,545,546,549],{"class":278,"line":326},[276,547,548],{"class":293},"    \"0c872254d5f9982d78a14eb0ba09cbb2\"",[276,550,543],{"class":286},[276,552,553,556],{"class":278,"line":344},[276,554,555],{"class":293},"    \"4f4a9410ffcdf895c4adb880659e9b5c0dd1f23a30790684340b3eaacb045398\"",[276,557,543],{"class":286},[276,559,560,563,566,569,572,575,577],{"class":278,"line":367},[276,561,562],{"class":286},"  ].",[276,564,565],{"class":319},"map",[276,567,568],{"class":286},"((hex) ",[276,570,571],{"class":282},"=>",[276,573,574],{"class":286}," Uint8Array.",[276,576,332],{"class":319},[276,578,579],{"class":286},"(hex)),\n",[276,581,582,584,587,589,592,594,597],{"class":278,"line":373},[276,583,347],{"class":286},[276,585,586],{"class":293},"\"alpha\"",[276,588,353],{"class":286},[276,590,591],{"class":293},"\"beta\"",[276,593,353],{"class":286},[276,595,596],{"class":293},"\"gamma\"",[276,598,364],{"class":286},[276,600,601],{"class":278,"line":379},[276,602,370],{"class":286},[276,604,605,608,610,613,615],{"class":278,"line":386},[276,606,607],{"class":286},"found.items.",[276,609,565],{"class":319},[276,611,612],{"class":286},"((item) ",[276,614,571],{"class":282},[276,616,617],{"class":286}," item.recipe?.input);\n",[276,619,620],{"class":278,"line":392},[276,621,622],{"class":382},"\u002F\u002F [\"gamma alpha\", \"Beta,Gamma\", undefined]\n",[255,624,625],{},"Each text is built once. Its digest is held against every target of that length. A match fills in that target's recipe. The search goes on for the rest. Five digests of one length cost what the slowest of them costs alone. Not bad for one extra pair of brackets.",[255,627,628,629,631,632,635],{},"Mixed lengths are fine. The 32-byte target gets SHA-256 and its crowd. The 16-byte one gets MD5 and friends. ",[262,630,488],{}," counts every length. A length with all its recipes found stops costing anything. Your own ",[262,633,634],{},"algorithms"," split the same way, and one that fits none of the digests is an error.",[255,637,638,639,642,643,645],{},"The third digest? It's SHA-256 of ",[262,640,641],{},"delta",", and nobody passed that word. So it comes back with no recipe. The other two keep theirs. They also survive ",[262,644,501],{},": whatever was found before it hit stays found.",[250,647,649],{"id":648},"from-the-shell","From the shell",[255,651,652],{},"The recipe and the text that was hashed go to stdout. The count and the verdict go to stderr:",[267,654,658],{"className":655,"code":656,"language":657,"meta":272,"style":272},"language-bash shiki shiki-themes hashes hashes hashes","hashes search 250f37726d6862939f723edc4f993fde9d33c6004aab4f2203d9ee489d61ce4c \\\n  heisenbergsuncertaintyprinciple giveitjustonesecond jacquefresco 2>\u002Fdev\u002Fnull\n# sha256 of the words \"jacquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\" joined by \"\", case as-is\n# input \"jacquefrescogiveitjustonesecondheisenbergsuncertaintyprinciple\"\n","bash",[262,659,660,674,691,696],{"__ignoreMap":272},[276,661,662,665,668,671],{"class":278,"line":279},[276,663,664],{"class":319},"hashes",[276,666,667],{"class":293}," search",[276,669,670],{"class":293}," 250f37726d6862939f723edc4f993fde9d33c6004aab4f2203d9ee489d61ce4c",[276,672,673],{"class":286}," \\\n",[276,675,676,679,682,685,688],{"class":278,"line":300},[276,677,678],{"class":293},"  heisenbergsuncertaintyprinciple",[276,680,681],{"class":293}," giveitjustonesecond",[276,683,684],{"class":293}," jacquefresco",[276,686,687],{"class":282}," 2>",[276,689,690],{"class":293},"\u002Fdev\u002Fnull\n",[276,692,693],{"class":278,"line":307},[276,694,695],{"class":382},"# sha256 of the words \"jacquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\" joined by \"\", case as-is\n",[276,697,698],{"class":278,"line":326},[276,699,700],{"class":382},"# input \"jacquefrescogiveitjustonesecondheisenbergsuncertaintyprinciple\"\n",[255,702,703,706,707,710,711,714,715,718,719,353,722,457,725,728,729,732,733,736,737,740,741,744],{},[262,704,705],{},"--joiners"," takes a JSON array, since a joiner can be a comma: ",[262,708,709],{},"--joiners '[\"\", \"-\", \"_\"]'",". Words split on spaces, quoted or not, so ",[262,712,713],{},"\"jacque fresco\""," is two words. Bad news? Not really. The empty joiner glues them back into ",[262,716,717],{},"jacquefresco"," and the search above finds it anyway, a few hundred hashes later. ",[262,720,721],{},"--cases",[262,723,724],{},"--algorithms",[262,726,727],{},"--chains"," take comma lists. So does the digest itself. Hex and base64 never hold a comma, so ",[262,730,731],{},"hashes search \u003Cdigest>,\u003Cdigest> alpha beta"," is safe. Both go in one pass. Each digest gets its own line, ",[262,734,735],{},"MATCH"," with the recipe or ",[262,738,739],{},"NO MATCH",". The exit code stays 1 until every one has a recipe. ",[262,742,743],{},"--limit"," stops at 100,000,000 hashes unless you say otherwise. On a terminal the running count ticks over itself. A pipe gets the total and the verdict, nothing else.",[250,746,748],{"id":747},"nothing-matched-now-what","Nothing matched. Now what?",[255,750,751],{},"The answer says exactly what it covered. Here a guess dropped the c from the name and kept to SHA-256:",[267,753,755],{"className":655,"code":754,"language":657,"meta":272,"style":272},"hashes search 250f37726d6862939f723edc4f993fde9d33c6004aab4f2203d9ee489d61ce4c \\\n  jaquefresco giveitjustonesecond heisenbergsuncertaintyprinciple --algorithms sha256\n# Searching 153 hashes\n# NO MATCH in 153 hashes\n# Covered 1 to 3 of the words \"jaquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\"; joiners \"\", \" \", \",\", \"\\n\"; cases as-is, lower, upper, title; algorithms sha256; 1 round.\n",[262,756,757,767,783,788,793],{"__ignoreMap":272},[276,758,759,761,763,765],{"class":278,"line":279},[276,760,664],{"class":319},[276,762,667],{"class":293},[276,764,670],{"class":293},[276,766,673],{"class":286},[276,768,769,772,774,777,780],{"class":278,"line":300},[276,770,771],{"class":293},"  jaquefresco",[276,773,681],{"class":293},[276,775,776],{"class":293}," heisenbergsuncertaintyprinciple",[276,778,779],{"class":293}," --algorithms",[276,781,782],{"class":293}," sha256\n",[276,784,785],{"class":278,"line":307},[276,786,787],{"class":382},"# Searching 153 hashes\n",[276,789,790],{"class":278,"line":326},[276,791,792],{"class":382},"# NO MATCH in 153 hashes\n",[276,794,795],{"class":278,"line":344},[276,796,797],{"class":382},"# Covered 1 to 3 of the words \"jaquefresco\", \"giveitjustonesecond\", \"heisenbergsuncertaintyprinciple\"; joiners \"\", \" \", \",\", \"\\n\"; cases as-is, lower, upper, title; algorithms sha256; 1 round.\n",[255,799,800],{},"So is the idea dead? No. Only that scope is. The real word had a c, or the digest went through three rounds, or there's a fourth word you haven't found. Widen one thing at a time. The exit code is 1, so a script can tell.",[250,802,804],{"id":803},"for-agents","For agents",[255,806,807,810,811,814],{},[262,808,809],{},"hashes_digest_search"," takes the same things as arguments and answers in the same lines. ",[262,812,813],{},"digest"," takes a list too, up to 16, and the answer opens with how many got a recipe, then one block per digest. A tool call stops at a million hashes, fewer when the words run long, a list included, and then names the arguments to narrow. Every word comes back in quotes, so a word with a line feed in it can't fake a line of the answer. Brute force, but polite about it.",[816,817,818],"style",{},"html pre.shiki code .skH_V, html code.shiki .skH_V{--shiki-light:var(--shiki-token-keyword);--shiki-default:var(--shiki-token-keyword);--shiki-dark:var(--shiki-token-keyword)}html pre.shiki code .s38Sx, html code.shiki .s38Sx{--shiki-light:var(--ui-text-highlighted);--shiki-default:var(--ui-text-highlighted);--shiki-dark:var(--ui-text-highlighted)}html pre.shiki code .shU9J, html code.shiki .shU9J{--shiki-light:var(--shiki-token-string);--shiki-default:var(--shiki-token-string);--shiki-dark:var(--shiki-token-string)}html pre.shiki code .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}html pre.shiki code .scIB-, html code.shiki .scIB-{--shiki-light:var(--shiki-token-comment);--shiki-default:var(--shiki-token-comment);--shiki-dark:var(--shiki-token-comment)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":272,"searchDepth":300,"depth":300,"links":820},[821,822,823,824,825,826,827],{"id":252,"depth":300,"text":253},{"id":401,"depth":300,"text":402},{"id":481,"depth":300,"text":482},{"id":509,"depth":300,"text":510},{"id":648,"depth":300,"text":649},{"id":747,"depth":300,"text":748},{"id":803,"depth":300,"text":804},"You have the words and the digest. Find the order and the joiner and the case and the algorithm that turn one into the other","md",null,{"icon":832},"i-lucide-shuffle",{"title":834,"description":828},"Find which words and which hash made a digest in TypeScript","xeyq5_pKFIteeYVbVxNeR0CwepxBHSejCjE4z5ETAA0",[837,839],{"title":28,"path":29,"stem":30,"description":838,"children":-1},"A digest with no name on it. Read its prefix or its length and list the algorithms that fit. Each one says if hashes can compute it",{"title":36,"path":37,"stem":38,"description":840,"children":-1},"The hashes command. Hash and HMAC and verify from a shell or stdin with the digest alone on stdout",1791911606468]