• Stars
    star
    147
  • Rank 251,347 (Top 5 %)
  • Language
    C
  • License
    MIT License
  • Created over 15 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Fork of http://web.archive.org/web/20101031205747/http://www.tothink.com/mnemonic/
Oren Tirosh is no longer maintaining the original version of this project.
Stephen Paul Weber likes it and is making it accessible on GitHub.

These routines implement a method for encoding binary data into a sequence
of words which can be spoken over the phone, for example, and converted
back to data on the other side.

For more information see <http://web.archive.org/web/20101031205747/http://www.tothink.com/mnemonic/>

There are some other somewhat similar systems that seem less satisfactory:

- OTP was designed for easy typing, and for minimizing length, but as
  a consequence the word list contains words that are similar ("AD"
  and "ADD") that are poor for dictating over the phone

- PGPfone has optimized "maximum phonetic distance" between words,
  which resolves the above problem but has some other drawbacks:

  - Low efficiency, as it encodes a little less than 1 bit per
    character;

  - Word quality issues, as some words are somewhat obscure to
    non-native speakers of English, or are awkward to use or type.

Mnemonic tries to do better by being more selective about its word
list.  Its criteria are thus:

Mandatory Criteria:

 - The wordlist contains 1626 words.

 - All words are between 4 and 7 letters long.

 - No word in the list is a prefix of another word (e.g. visit,
   visitor).

 - Five letter prefixes of words are sufficient to be unique. 

Less Strict Criteria:

  - The words should be usable by people all over the world. The list
    is far from perfect in that respect. It is heavily biased towards
    western culture and English in particular. The international
    vocabulary is simply not big enough. One can argue that even words
    like "hotel" or "radio" are not truly international. You will find
    many English words in the list but I have tried to limit them to
    words that are part of a beginner's vocabulary or words that have
    close relatives in other european languages. In some cases a word
    has a different meaning in another language or is pronounced very
    differently but for the purpose of the encoding it is still ok - I
    assume that when the encoding is used for spoken communication
    both sides speak the same language.

  - The words should have more than one syllable. This makes them
    easier to recognize when spoken, especially over a phone
    line. Again, you will find many exceptions. For one syllable words
    I have tried to use words with 3 or more consonants or words with
    diphthongs, making for a longer and more distinct
    pronounciation. As a result of this requirement the average word
    length has increased. I do not consider this to be a problem since
    my goal in limiting the word length was not to reduce the average
    length of encoded data but to limit the maximum length to fit in
    fixed-size fields or a terminal line width.

  - No two words on the list should sound too much alike. Soundalikes
    such as "sweet" and "suite" are ruled out. One of the two is
    chosen and the other should be accepted by the decoder's
    soundalike matching code or using explicit aliases for some words.

  - No offensive words. The rule was to avoid words that I would not
    like to be printed on my business card. I have extended this to
    words that by themselves are not offensive but are too likely to
    create combinations that someone may find embarrassing or
    offensive. This includes words dealing with religion such as
    "church" or "jewish" and some words with negative meanings like
    "problem" or "fiasco". I am sure that a creative mind (or a random
    number generator) can find plenty of embarrasing or offensive word
    combinations using only words in the list but I have tried to
    avoid the more obvious ones. One of my tools for this was simply a
    generator of random word combinations - the problematic ones stick
    out like a sore thumb.

  - Avoid words with tricky spelling or pronounciation. Even if the
    receiver of the message can probably spell the word close enough
    for the soundalike matcher to recognize it correctly I prefer
    avoiding such words. I believe this will help users feel more
    comfortable using the system, increase the level of confidence and
    decrease the overall error rate. Most words in the list can be
    spelled more or less correctly from hearing, even without knowing
    the word.

  - The word should feel right for the job. I know, this one is very
    subjective but some words would meet all the criteria and still
    not feel right for the purpose of mnemonic encoding. The word
    should feel like one of the words in the radio phonetic alphabets
    (alpha, bravo, charlie, delta etc).

mnemonic.h	Header file
mnemonic.c	Encoding/decoding and associated routines
mn_wordlist.c	The word list itself
mnencode.c	Sample program - encode data from stdin to stdout
mndecode.c	Sample program - decode data from stdin to stdout

== Other Implementations ==

Elixr:      <https://github.com/mwmiller/mnemonex>
Go:         <https://bitbucket.org/dchapes/mnemonicode>
JavaScript: <https://github.com/mbrubeck/mnemonic.js>
Python:     <https://github.com/bwhmather/python-mnemonicode>
Rust:       <https://github.com/mbrubeck/rust-mnemonic>

More Repositories

1

shttpd

An HTTP server written in POSIX shell script
Ruby
41
star
2

OpenPGP-Python

A port of OpenPGP-PHP to Python
Python
35
star
3

singpolyma-kernel

A basic microkernel
C
34
star
4

unexceptionalio

IO without any PseudoExceptions
Haskell
28
star
5

cheogram

Moved to https://git.singpolyma.net/cheogram
Haskell
26
star
6

wai-session

Flexible session middleware for WAI
Haskell
15
star
7

FuseFS

Port FuseFS to Ruby1.9
Ruby
12
star
8

openpgp-spec

Simplified, modular OpenPGP specification
11
star
9

st-sdl

SDL based terminal derived from st
C
9
star
10

Copyright-Act-Citizens--Draft

This project is about writing the people's ideal copyright law.
9
star
11

social-search-me

The Open Web's people search engine
PHP
8
star
12

OpenPGP-Haskell

Haskell
8
star
13

xgame

High-level game framework based on rubygame
Ruby
8
star
14

mustache2hs

An attempt to compile Mustache templates to Haskell code
Haskell
7
star
15

thingmenu

C
7
star
16

HTML2Markdown

Convert HTML to Markdown in ruby
Ruby
7
star
17

theveeb-ecosystem

Only kinda a secret.
C
6
star
18

sgx-vitelity

XMPP Gateway using Vitelity as a backend.
Haskell
6
star
19

git-date-haskell

Bindings onto the date parsing code from Git
C
6
star
20

git-mediawiki

Talk to a mediawiki from git
Ruby
6
star
21

cs-top-and-bottom

Teaching CS from the top and bottom
5
star
22

twitter2omb

This app lets users subscribe to Twitter.com contacts on any OpenMicroBlogging compatible platfrom.
Ruby
5
star
23

ripple-rails

Rails integration for Ripple payment notifications.
Ruby
5
star
24

git-ticket

Distributed ticket tracking
Shell
5
star
25

Copyright-Act-of-Canada

4
star
26

icefilms-scripts

Shell
4
star
27

singpolyma

This repository is just miscellaneous stuff. It is from my old devjavu SVN repo. Some of this stuff should get it's own repo.
PHP
4
star
28

haskades

Autogenerate bindings for using Haskell with BB10
HTML
4
star
29

route-generator

Utility to generate routes for use with yesod-routes
Haskell
4
star
30

NNTP-Forum

A webforum fronend onto an NNTP newsgroup.
Ruby
4
star
31

OpenPGP-CryptoAPI

Implementation of cryptography for use with OpenPGP using the crypto-api libraries
Haskell
4
star
32

plivo-haskell

Plivo API wrapper for Haskell
Haskell
4
star
33

Desktop-Entry-Utility

And library
C
3
star
34

musearch

Search ALL the microblogs!
Ruby
3
star
35

ecdsa-haskell

ECDSA stuff in Haskell
Haskell
3
star
36

singpolymaplay

Code from singpolymaplay.ning.com
PHP
3
star
37

tagging

Code from tagging.ning.com
PHP
3
star
38

OpenPGP-Crypto

Implementation of cryptography for use with OpenPGP using the Crypto library
Haskell
3
star
39

http-pool

Apache-like pool of HTTP subprocesses
Ruby
3
star
40

simple-form-haskell

Haskell
3
star
41

sock2stream

Tunnel a socket over a single datastream (stdin/stdout)
Haskell
3
star
42

someblogs

Code from someblogs.ning.com
PHP
2
star
43

wai-hastache

Nice wrapper around hastache for use with WAI
Haskell
2
star
44

ruby-oauth-app

Uses oauth_provider
Ruby
2
star
45

Public-Domain-Calculator

Powered by Freebase
2
star
46

pinp

PINP is not Perl
2
star
47

showpath

C
2
star
48

search-folders

Uses FUSE and locate/updatedb to create "search folders"
Ruby
2
star
49

wrinks

Code from wrinks.ning.com
PHP
2
star
50

creole

Utilities that transform from/to creole markup
2
star
51

papercut-wordpress

A WordPress backend for Papercut (NNTP server in Python)
Python
2
star
52

ripple-pos

2
star
53

filess

Code from filess.ning.com and jscripts.ning.com
PHP
2
star
54

MyLibrary

Showcase your books and let other suggest books to you.
Ruby
2
star
55

BitBrawl

An isometric PvP brawler with energy
Haskell
2
star
56

imapmd

Simple single-connection IMAP server for Maildir that speaks STDIN/STDOUT
Haskell
2
star
57

theveeb-ecosystem-server

Server-side components
PHP
2
star
58

mnw

PHP
2
star
59

xoxotools

This is the code from the Ning site. I can no longer actually update the code on the Ning site, as they've taken away that feature.
PHP
2
star
60

openexchangerates-haskell

Fetch exchange rates from OpenExchangeRates.org
Haskell
2
star
61

mv

A portable POSIX-compliant implementation of the mv command
C
2
star
62

adventure

A DSL for writing adventure games.
Ruby
2
star
63

OrdClock

Ordinal clock display widget for Android
Java
2
star
64

wordpress-extended-profile

Pulled out of the DiSo project to this repository
PHP
2
star
65

XNNTPD

eXtensible NNTP Daemon
Ruby
2
star
66

RPNR

Reverse Polish Notation for Ruby
Ruby
2
star
67

elerea-sdl

Elerea FRP wrapper for SDL
Haskell
2
star
68

Email-Verify

Verify SMTP email addresses using OpenID and Google App Engine
Python
2
star
69

noflash

demand.openid clone in portable PHP
PHP
2
star
70

chipmunk

Fork of Chipmunk to provide debian packaging for ruby bindings
2
star
71

ripple-haskell

Implementation of Ripple client protocol in Haskell
Haskell
2
star
72

aggregator

Ruby
1
star
73

GSWoT

Gossamere Spider Web of Trust Documents
1
star
74

HTTP-over-BTP

HTTP over Browser Transfer Protocol (broken HTTP subset)
Ruby
1
star
75

sortable-coding-challenge

Haskell
1
star
76

hCard-to-Google-Bookmarklet

Because Google Sucks
PHP
1
star
77

NME-Haskell

Bindings onto NME for Haskell
Haskell
1
star
78

redo-gal

Simple photogallery based on redo
Shell
1
star
79

pktree-haskell

Implementation of PKtrees in Haskell
Haskell
1
star
80

ipfs-websub

A WebSub hub for all of IPFS
Haskell
1
star
81

base58address

Parsing and serialization for Base58 addresses (Bitcoin and Ripple)
Haskell
1
star
82

posix-filelock-haskell

Nice wrapper around POSIX fcntl advisory locks
Haskell
1
star
83

roshambo

Simple RPS game webapp in Haskell with WAI
Haskell
1
star
84

simple-slides

A simple image-and-music slideshow tool
C
1
star
85

trysh

An interactive POSIX shell tutorial.
Shell
1
star
86

actionstream-data

YAML and icons for Action Streams
Shell
1
star
87

smtp2mta

Listen for SMTP traffic and send it to an MTA script
Haskell
1
star
88

raw-materials

Some notes about https://www.hillelwayne.com/post/raw-materials/
Haskell
1
star
89

unexceptionalio-trans

Wrapper around unexceptionalio for ergonomic use with transformers
Haskell
1
star
90

wai-util

Utility functions for WAI that haven't found another home yet
Haskell
1
star
91

wai-digestive-functors

Helpers to bind digestive-functors onto wai requests
Haskell
1
star
92

WEdit

Edit/view documents with wikitext
C
1
star
93

permute-RankNTypes

Permutation parsers using higher-kinded polymorphism
Haskell
1
star
94

nntp-maillist

Mailing list-like bridge onto NNTP
Ruby
1
star
95

mualbum

Ruby
1
star
96

Salmon

Fork of Salmon GAE code to use OpenPGP
Python
1
star
97

wai-session-tokyocabinet

Session store based on Tokyo Cabinet
Haskell
1
star
98

badcode.rocks

Shell
1
star
99

currency-haskell

Types representing standard and non-standard currencies
Haskell
1
star