입력을 퍼뜨리는 기능


14

n- 비트 숫자에서 다음 특성을 갖는 n- 비트 숫자에 함수 가 있는지 알고 싶습니다 f.

  • f 는 형용사이어야한다
  • 모두 ff1 계산할 꽤 빨리해야한다
  • f 는 입력과 유의 한 상관 관계가없는 숫자를 반환해야합니다.

근거는 다음과 같습니다.

데이터에서 작동하는 프로그램을 작성하고 싶습니다. 데이터의 일부 정보는 검색 키가 알파벳의 상징 인 이진 검색 트리에 저장됩니다. 시간이 지남에 따라 알파벳에 기호를 더 추가합니다. 새로운 기호는 사용 가능한 다음 무료 번호를 얻습니다. 따라서 나무는 항상 작은 키에 대한 작은 편견을 가지므로 필요한 것보다 더 많은 균형을 잡을 수 있습니다.

내 생각에 심볼 수를 탈수하는 f 가 널리의 전체 범위에 걸쳐 확산되도록 [0,2641] . 기호 번호는 한 번만 발생하는 입력 및 출력 중에 만 중요하므로 이러한 기능을 적용하는 데 너무 많은 비용이 들지 않아야합니다.

Xorshift 난수 생성기의 한 번의 반복에 대해 생각했지만 이론적으로 가능해야하지만 실제로 실행 취소 방법을 모르겠습니다.

아무도 그런 기능을 알고 있습니까?
이것이 좋은 생각입니까?


1
나는 전문가는 아니지만 의사 난수 순열을 사용할 수 있습니다 (예 : Feistel 암호 참조 )
Vor

본질적으로 해시 함수를 계산하는 경우 해싱을 사용하지 않는 이유는 무엇입니까?
vonbrand

@vonbrand Hashing은 되돌릴 수 없습니다. 요구 사항 2를 참조하십시오.
FUZxxl

뒤집을 수 있어야합니까? 조회를 통해 가역적으로 만드는 데 어떤 문제가 있습니까?
vonbrand

1
(f (x), x)를 키로 저장할 수 있습니다.
adrianN

답변:


6

당신이 사용할 수있는 피보나치 해싱을 즉,

.hF(k)=k512k512

들면 가 얻는 N 페어 - 고유 번호는 (약) 고르게 확산 [ 0 , 1 ] . [ 1 .. M ]으로 스케일링 하고 반올림 (아래로)하면 해당 간격으로 숫자가 고르게 퍼집니다.k=1,,nn[0,1][1..M]

예를 들어, 다음은 를 확장 [ 0..10000 ] (좌측 오리지널 시퀀스는, 오른쪽 정렬) :hF(1),,hF(200)[0..10000]

여기에 이미지 설명을 입력하십시오

이것은 Knuth가 곱셈 해싱 이라고 부르는 인스턴스입니다 . 대한 컴퓨터의 워드 크기, 일부 정수 상대적으로 소수 wM 필요한 주소의 수, 우리가 사용하는wAwM

h(k)=M((kAw)mod1)

해싱 함수로. 위의 내용은 (충분한 정밀도로 계산할 수 있는지 확인하십시오). 이것은 또한ϕ-1이외의 다른 비합리적인 숫자와도 작동하지만"가장 균일하게 분포 된"숫자로 이어지는 두 숫자 중 하나입니다.A/w=ϕ1=512ϕ1

Donald Knuth 의 컴퓨터 프로그래밍 기술 , 3 권 (제 2 판 513 페이지 6.4 장) 에서 더 많은 내용을 찾아보십시오 . 특히 결과 숫자가 쌍으로 구별되는 이유 (적어도 )와 ϕ - 1 대신 자연 Aw 를 사용하는 경우 역함수를 계산하는 방법을 찾을 수 있습니다 .nMAwϕ1


1
효율적 으로 계산하는 방법 ? f1
frafl

1
@frafl 나는 나의 편집이 당신의 관심사를 어느 정도 해결하기를 바랍니다. 그러나 이러한 해싱 기술은 특히 효율적으로 뒤집을 수 있도록 설계되지 않았습니다.
Raphael

그렇습니다, 나는 그것을 찬성 할 것이지만, 나는 그것을 정답으로 추천하지 않을 것입니다.
frafl

1

들어 비트 입력,이 기능이 작동합니다 :k

hash(n)=(nmod2k2)2k2+ndiv2k2

이것은 가역적이다. 즉, 이며 비 순차적 쌍 { n , m } , n < m을 가지며 , 여기서 h a s h ( m ) < h a s h ( n )hash(hash(n))=n{n,m},n<mhash(m)<hash(n) . 특히 입력이 { 1 , , 2 k 인 경우 출력과 입력이 상관 될 수 있음에 유의하십시오.{1,,2k21}

참조 : 가역 해시 함수


이것은 간단하고 멋지게 보입니다. 나는 그것을 테스트 할 것입니다.
FUZxxl

1
1ρ

꽤 분명하다! 64 비트 (0x00000000FFFFFFFF)의 경우 32 비트를 시프트 (<<)해야합니다. 이 기능은 실용적이고 간단하며 실용적입니다.
Reza

1
x{1,,2321}232x
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.