2016-05-19 20 views
1

BaseXで管理されるXMLデータベースに格納された要素値からハッシュを生成する必要があります。 ハッシュ関数を適用する。 hash:md5(value)は、次のStringを返しています: "|¶﹋¥* PܮQፒ|¶﹋¥* PܮQፒ" hash:sha1()は同様のナンセンスを返します。生成されたハッシュのBaseXエンコーディング

utf8 beforにwhatever-encodingを設定しましたか? BaseX 8.4.4

the explicit documentation for the basex hash module 当たり
+0

- これは、8.3.xから8.4.4の間で、GUIの動作が悪化した場所です。以前は、すぐに使用できる 'xs:* Binary'データ型の' xs:string'レンダリングを使用していました。 (私はこれが "バグ"であるとは確信していません。それは、現行の行動が違反していることが証明されていることを認識していないからです。 –

答えて

2

を使用

(XMLデータベース自体は、いくつかの人間が読み取り可能な符号化である)、結果がxs:base64Binaryである - これは、それがベース64のデータとして文字列にキャストしながら、そのコアではまだバイナリです。

あなたが進数字のxs:stringにそれをキャストする場合:

xs:string(xs:hexBinary(hash:md5("hello"))) 

...または、hash:md5()によって返されるデフォルトのbase64で表現するために、再びバイナリ形式への復帰を防ぐために、文字列化... BaseX 8.4で

xs:string(hash:md5("hello")) 
+0

最初は、あなたがmd5-hashであると主張したことです。 IMOこれは任意のbaseX-hash-fnのデフォルト戻り値でなければなりません。現在のデフォルトはむしろ無駄です... – Jan

+0

私は同意しません - ハッシュ値は純粋なバイナリ値です。人間が読めるように拡張された大きな形式は、人間にとってのものです。情報の密度を減らし、ハッシュテーブルのスロットがいっぱいになるのをより少なくするために、ハッシュテーブルルックアップのようなマシンの使用に不必要に非効率的です。 –

+0

...明確にするために、私はバグだと思っています(望ましくない動作 - 「バグ」とは「ドキュメントとは逆の意味」を意味します)。**人間にはバイナリ値として表されますが、それは計算され、そのようにボンネットの下に格納されているバグではありません。 –

3

serialization method "basex"は現在、デフォルトの直列化の方法として使用されます。結果として、タイプxs:base64Binaryおよびxs:hexBinaryの項目は、BaseX GUIであってもネイティブバイナリ表現で出力されるようになりました。

出力メソッドを変更するのは、古い "生"直列化メソッドと、ネイティブ表現でバイナリデータ(ファイルコンテンツなど)を返さなかったRESTXQやその他のAPIに関するユーザーからのフィードバックを繰り返した結果です。チャールズ・ダフィーが既に示されているように、あなたはまた、バイナリの六角またはBase64の表現を見ることがxs:string()string()を使用することができます

declare option output:method 'text'; 
hash:md5('abc') 

:あなたが進またはBASE64などのバイナリデータの出力を持っているしたい場合は、別の出力方法に切り替えることができますデータ。ドキュメンテーションのさまざまな例が更新されました(皆さん、気軽にWikiに登録してください!)。

パフォーマンス面では、バイナリデータを比較すると文字列表現を比較するよりもはるかに高速になります。 BaseXのHashing Moduleは、xs:base64Binary型の項目を生成します(バイナリデータを処理するXQueryの他のほとんどの標準関数または拡張関数と同様)。ただし、XQuery仕様では16進数とBase64を直接比較することはできません。したがって、16進数をBase64に変換する必要があります。 BaseX(および他のほとんどのXQuery実装)では、内部バイト表現が同一であるため、これは非常に安価です。例:BaseXの最新8.4.4 snapshot

let $hash := '900150983CD24FB0D6963F7D28E17F72' 
let $input := 'abc' 
return xs:hexBinary(hash:md5($input)) = xs:hexBinary($hash) 

、ハッシュ関数の入力としてノードを指定することが可能であるので、文字列に要素をキャストするもう必要がなくなる。

興味深い
let $hash := '900150983CD24FB0D6963F7D28E17F72' 
let $toHashElem := <x>abc</x> 
return xs:hexBinary(hash:md5($toHashElem)) = xs:hexBinary($hash) 
関連する問題