MD5처럼 입력되는 문자나숫자를 유니크하게 9자리로 만드는 펑션이 있을까요?

ktlsu1231의 이미지

안녕하세요.
MD5처럼 입력되는 문자나숫자를 유니크하게 9자리로 만드는 펑션이 있을까요?
MD5나 MD2는 모두다 32자리 HEX라 너무 큽니다.
9자리 HEX로 변환시키는 방법이 있을까요?
ID Serial 때문에 그렇습니다.
부탁드립니다. :cry:

eminency의 이미지

잘라서 쓰세요 -_-;

MD5도 32자리가 유니크하다는 보장은 없지 않나요? 확률적으로 매우 낮을 뿐...;

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

ktlsu1231의 이미지

컥.. 그런 방법이...

md5 라는 단방향 해쉬 함수도 중복되나 보군요..

Prentice의 이미지

CDDB는 숫자를 가지고 8자리 16진수를 만드나본데요, 참고하시면 어떨까요? 위키피디아에서 CDDB를 검색해서 찾았습니다.

http://freedb.org/modules.php?name=Sections&sop=viewarticle&artid=6

익명 사용자의 이미지

* md5 를 쓴다고 가정했을때, 16진수(0~F)로 출력하는게 보통인데, 이를 32진법이나, 64진법등으로 손수~ 만들어서 처리한다면 9자리로 하는것도 문제는 아닙니다.(실제로 저는 36진법을 만들어 사용한적이 있습니다. 이유는? 질문자 님과 비슷한 이유였던것 같군요. 가물가물~)
* md5 말고 다른 해쉬알고리즘 sha1등을 고려하는것도 좋습니다.

오호라의 이미지

정답 : 없음.

유니크하게 생성할수는 있으나... 콜리션발생.

지금 이 순간에도 콜리션문제를 해결할려고 많은 수학자와 컴퓨터과학자분들이 연구실에서 고민을 하고 계실겁니다.

그리고, 국어사전에 "검증"이란 단어가 있죠.

공인된 협회, 기간, 단체...가 아닌 한명 또는 소수의 사람들이 많든 평션이라면...

물론, 수학적으로 증명가능하다면 모를까...

암튼...

MD5같은 검증된 해쉬펑션을 쓰시는걸 추천합니다.

Hello World.

익명 사용자의 이미지

ktlsu1231 wrote:

...
입력되는 문자나숫자를 유니크하게 9자리로 만드는 펑션
...

* 입력되는 문자나 숫자가 같을 경우가 있다면, 시간등을(해상도는 분위기보고..) 추가하여 입력문자열을 형성시키고, 해쉬함수에 넣어서 보다 해쉬 충돌을 예방하게 만들 수 있습니다.

* md5 hash가 충돌이 일어날 가능성이 아주 낮습니다만, 최근 md5 보다는 sha1을 권장하고 있습니다.

* 참고 : http://bbs.kldp.org/viewtopic.php?t=42649

익명 사용자의 이미지

단방향일 필요가 없다면, 압축 기법 중에 뭔가 쓸만할게 있을 것 같습니다만...

ktlsu1231의 이미지

안녕하세요.

단방향일 필요는 없습니다. 숫자,영문자 어떤 입력이 들어와도
유니크한 최대 13자리 영대/소문자, 숫자가 나오면 됩니다.

많은 정보 정말 감사드립니다. :o

익명 사용자의 이미지

오호라 wrote:
정답 : 없음.

유니크하게 생성할수는 있으나... 콜리션발생.

지금 이 순간에도 콜리션문제를 해결할려고 많은 수학자와 컴퓨터과학자분들이 연구실에서 고민을 하고 계실겁니다.

간단하게 생각해보죠.
큰집합이 있고(원문).. 작은집합이 있습니다(해싱값).. 큰집합에서 작은집합으로 1:1 매핑이 유니크하게 이루어지겠습니까? 콜리션을 해결하려고 연구하는 과학자가 있다면 정신 번쩍들도록 을룡타를 날려주겠습니다.
설 잘 보내세요

lifthrasiir의 이미지

ktlsu1231 wrote:
안녕하세요.

단방향일 필요는 없습니다. 숫자,영문자 어떤 입력이 들어와도
유니크한 최대 13자리 영대/소문자, 숫자가 나오면 됩니다.

많은 정보 정말 감사드립니다. :o

제가 추측하기로는 그리 어려운 문제는 아닐 듯 싶습니다. 단 몇 가지 가정이 필요합니다.

이미 생성되었던 모든 ID 값들을 기록하고 있다면 충돌을 방지하기 위해서 적당한 방법을 사용할 수 있습니다. 예를 들어서, md5를 쓴다고 할 때 "아주 어쩌다가" 다른 ID 값과 겹치면 ID 값을 다시 md5를 해서 쓰면 된다던지 하는 것이죠. 해쉬 테이블, 특히 chaining techinique를 쓰는 경우 이런 방법을 자주 사용합니다. (linear probing이다 뭐다 하는 것들이 다 여기에 해당하죠) 다시 말씀드리지만 이 방법은 이미 생성되었던 모든 ID 값들을 기록해야 합니다. 그렇지 않고서는 어떤 방법을 쓰더라도 충돌을 피하기는 힘듭니다.

다음은 제가 대충 짜 본 예시 코드입니다. 안 돌아 가도 이상할 건 없습니다 -_-; MD* 구조체/함수들은 RFC 1321의 그것들이고, dest에는 적어도 9바이트가 할당되어 있어야 합니다. (ID 8자리 + 널문자)

#include <inttypes.h>
#include "md5.h"

void hashfunc(unsigned char *src, unsigned int srclen, unsigned char *dest) {
    MD_CTX ctx;
    uint32_t buf[4], hash;

    while (1) {
        MDInit(&ctx);
        MDUpdate(&ctx, src, srclen);
        MDFinal((unsigned char*) buf, &ctx);
        hash = ~(buf[0] + buf[1]) ^ (buf[2] - buf[3]);
        if (!is_id_already_used(hash)) break;
        src = (unsigned char *) buf;
        srclen = sizeof(buf);
    }

    sprintf(dest, "%08X", hash);
}

- 토끼군

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.